//activity里面不能做耗时比较长的操作、不仅会导致runtimeException、 //还会造成比较差的用户体验、需要把处理大量数据的操作放在单独的线程完成、 package com.ck; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.Button; public class HandlerDemoActivity extends Activity { private Button start,stop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewByIds(); start.setOnClickListener(new startOnClickListener()); stop.setOnClickListener(new stopOnClickListener()); } class startOnClickListener implements android.view.View.OnClickListener{ public void onClick(View v) { //线程对象加入到执行队列 handler.post(runnable); } } class stopOnClickListener implements android.view.View.OnClickListener{ public void onClick(View v) { handler.removeCallbacks(runnable); } } Handler handler = new Handler(); Runnable runnable = new Runnable(){ public void run() { //这里加入要做的操作 System.out.println("updateThread..."); handler.postDelayed(runnable, 3000); } }; void findViewByIds(){ start = (Button)findViewById(R.id.start); stop = (Button)findViewById(R.id.stop); } }
Implicit Intent 到底发给哪个activity?
这需要进行三个匹配,一个是action,一个是category,一个是data。根据三个的匹配结果,找到应该启动的Activity。
Action Implicit Intent
动作匹配指Android Intent Filter包含特定的动作或没有指定的动作。
一个Intent Filter有一个或多个定义的动作,如果没有任何一个能与Intent指定的动作匹配的话,这个Intent Filter在算作是动作匹配检查失败。
<intent-filter>元素中可以包括子元素<action>,比如:
<intent-filter>
<action android:name=”com.example.project.SHOW_CURRENT” />
<action android:name=”com.example.project.SHOW_RECENT” />
<action android:name=”com.example.project.SHOW_PENDING” />
</intent-filter>
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。
Category Implicit Intent
种类匹配更为严格。Intent Filter必须包含所有在解析的Intent中定义的种类。一个没有特定种类的Intent Filter只能与没有种类的Intent匹配。
<intent-filter>元素可以包含<category>子元素,比如:
<intent-filter . . . >
<category android:name=”android.Intent.Category.DEFAULT” />
<category android:name=”android.Intent.Category.BROWSABLE” />
</intent-filter>
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。
Data Implicit Intent
Intent的数据URI中的部分会与Intent Filter中的data标签比较。如果Intent Filter定义scheme,host/authority,path或mimetype,这些值都会与Intent的URI比较。任何不匹配都会导致Intent Filter从列表中删除。没有指定data值的Android Intent Filter会和所有的Intent数据匹配。
mimetype是正在匹配的数据的数据类型。当匹配数据类型时,你可以使用通配符来匹配子类型(例如,earthquakes/*)。如果Intent Filter指定一个数据类型,它必须与Intent匹配;没有指定数据的话全部匹配。
scheme是URI部分的协议——例如,http:,mailto:,tel:。
host-name或“data authority”是介于URI中scheme和path之间的部分(例如,www.google.com)。匹配主机名时,Intent Filter的scheme也必须通过匹配。
数据path是紧接在“data authority”的后面(例如,/ig)。path只在scheme和host-name部分都匹配的情况下才匹配。
数据在<intent-filter>中的描述如下:
<intent-filter . . . >
<data android:type=”video/mpeg” android:scheme=”http” . . . />
<data android:type=”audio/mpeg” android:scheme=”http” . . . />
</intent-filter>
<data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。
把Activity看成一个页面,在Android系统中,Activity 被作为 Activity 栈进行管理.
- 当前活动的Activity 处于栈顶.
- 非活动的Activity 压在栈中, 处于等待状况
一个Activity的状态有如下4种:
- 活动. (处于栈顶, 有焦点,可见)
- 暂停. (失去焦点,但可见)
- 停止. (失去焦点,不可见)
- 销毁. (被系统或进程结束)
一个Activity的方法有如下7个:
- .onCreate() 创建
- .onStart() 启动
- .onRestart() 重启.
- .onResume() 恢复
- .onPause() 暂停
- .onStop() 停止
- .onDestroy() 销毁
Activity 的生命周期的 Cases
a. Activiy1 启动
- Code:
super.onCreate()
- 运行顺序: ( Activity1 : onCreate() -> onStart() ->onResume() )
b. 从Activity1 跳转到 Activity2, 然后关闭Activity1.
- Code:
Intent intent = new Intent(); //新建一个Intent对象. intent.setClass(Activity1.this, Activity2.class); //设定Intent要启动的类. startActivity(intent); //启动一个新的Activity Activity1.this.finish(); //关闭当前的Activity.
- 运行顺序: (Activity1: onPause() )-> ( Activity2: onCreate() ->onStart() ->onResume()) -> (Activity1:onStop() ->onDestroy())
c. 关闭Activity1, 退出程序 , 或者按 "BACK" 键.
- Code:
Activity1.this.finish();
-运行顺序: Activity1: onPause()->onStop()->onDestroy();
d. 按"HOME"键, 然后再运行程序.
- 运行顺序: Activity1: onPause()->onStop() => 运行其他程序 => 再运行本程序: Activity1: onRestart()->onStart()-)>onResume()
e. 刷新Activity1
- Code:
public class LifeCycleActivity extends Activity { /** Called when the activity is first created. */ private static final String TAG = "MainActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i(TAG, "onCreate()"); Button button = (Button) this.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Intent intent = new Intent(LifeCycleActivity.this, Activity2.class); //startActivity(intent); reload(); } }); } @Override protected void onDestroy() { Log.i(TAG, "onDestroy()"); super.onDestroy(); } @Override protected void onPause() { Log.i(TAG, "onPause()"); super.onPause(); } @Override protected void onRestart() { Log.i(TAG, "onRestart()"); super.onRestart(); } @Override protected void onResume() { Log.i(TAG, "onResume()"); super.onResume(); } @Override protected void onStart() { Log.i(TAG, "onStart()"); super.onStart(); } @Override protected void onStop() { Log.i(TAG, "onStop()"); super.onStop(); } public void reload(){ Intent intent = getIntent(); this.finish(); startActivity(intent); } }
-运行顺序: onCreate()->onStart()->onResume() ==> 点按纽后 onPause()->onCreate()->onStart()->onResume()->onStop()->onDestroy()
更多的可以参考:
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/