1.
一个activity 完整的生命周期 自第一次调用 onCreate(Bundle)开始,直至调用onDestroy()为止。activity在onCreate()中设置所有"全局"状态以完成初始化,而在onDestroy()中释放所有系统资源。比如说,如果activity有一个线程在后台运行以从网络上下载数据,它会以 onCreate()创建那个线程,而以 onDestroy()销毁那个线程。
2. 一个activity的 可视生命周期 自 onStart() 调用开始直到相应的 onStop()调用。在此期间,用户可以在屏幕上看到此activity,尽管它也许并不是位于前台或者正在与用户做交互。在这两个方法中,你可以管控用来向用户显示这个activity的资源。比如说,你可以在onStart() 中注册一个BroadcastReceiver 来监控会影响到你UI的改变,而在onStop() 中来取消注册,这时用户是无法看到你的程序显示的内容的。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。
3. 一个activity的 前台生命周期 自 onResume() 调用起,至相应的 onPause()调用为止。在此期间,activity位于前台最上面并与用户进行交互。activity会经常在暂停和恢复之间进行状态转换──比如说当设备转入休眠状态或有新的activity启动时,将调用onPause() 方法。当activity获得结果或者接收到新的intent的时候会调用onResume() 方法。因此,在这两个方法中的代码应当是轻量级的。
当一个activity从这个状态转变到另一个状态时,它被以下列protected方法所通知:
- public class Activity extends ApplicationContext {
- protected void onCreate(Bundle savedInstanceState);
- protected void onStart();
- protected void onRestart();
- protected void onResume();
- protected void onPause();
- protected void onStop();
- protected void onDestroy();
- }
我们可以重载所有这些方法以在状态改变时进行合适的工作。所有的activity都必须实现 onCreate() 用以当对象第一次实例化时进行初始化设置。很多activity会实现 onPause()以提交数据变化或准备停止与用户的交互。
要注意的是,onPause(),onStop(),onDestory()这3个方法是可以被系统直接kill的,当系统内存不足的时候。
而平常从一个activity转向/回到另一个activity时,当新activity是full screen(弹出窗口,例如AlertDialog是不算的)的时候就会call 前一个activity的onPause(),然后call onStop(),而无论onPause或者onStop,都有可能被kill,所以一般在onPause就会执行savedata操作将所有持久性数据(比如用户的编辑结果)写入存储之中。
现在我们来看看两个activity在同一个进程内的调用情况:
1. 调用当前activity的 onPause() 方法。
2. 接着调用新启动activity的onCreate()、 onStart()和onResume()方法。
3. 然后,如果启动的activity不再于屏幕上可见,则调用它的onStop()方法。
以下我使用Logcat记录下来的Activity调用过程中的方法调用顺序:
1. 点击按钮去启动 Activity1,就会看到
- 05-08 09:39:48.389: DEBUG/Activity1(313): onCreate Activity 1
- 05-08 09:39:48.399: DEBUG/Activity1(313): onStart Activity 1
- 05-08 09:39:48.399: DEBUG/Activity1(313): onResume Activity 1
这说明一般Activity的启动顺序是
onCreate -> onStart -> onResume
2. 点击back返回键后
- 05-08 09:40:04.129: DEBUG/Activity1(313): onPause Activity 1
- 05-08 09:40:04.628: DEBUG/Activity1(313): onStop Activity 1
- 05-08 09:40:04.659: DEBUG/Activity1(313): onDestory Activity 1
退出当前Activity时,onPause -> onStop -> onDestory
3. 再次启动Activity
- 05-08 09:40:18.249: DEBUG/Activity1(313): onCreate Activity 1
- 05-08 09:40:18.249: DEBUG/Activity1(313): onStart Activity 1
- 05-08 09:40:18.259: DEBUG/Activity1(313): onResume Activity 1
和一般启动的顺序是一样的
4. 从Activity1启动Acitivity2
- 05-08 09:40:25.477: DEBUG/Activity1(313): onPause Activity 1
- 05-08 09:40:25.687: DEBUG/Activity2(313): onCreate Activity 2
- 05-08 09:40:25.687: DEBUG/Activity2(313): onStart Activity 2
- 05-08 09:40:25.719: DEBUG/Activity2(313): onResume Activity 2
- 05-08 09:40:26.277: DEBUG/Activity1(313): onStop Activity 1
Activity1.onPause -> Activity2.onCreate -> Activity2.onStart -> Activity2.onResume ->Activity1.onStop
5. 点击Home键回到桌面
- 05-08 09:40:31.777: DEBUG/Activity2(313): onPause Activity 2
- 05-08 09:40:32.658: DEBUG/Activity2(313): onStop Activity 2
Activity2.onPause - > Activity2.onStop
6. 回到原来的程序
- 05-08 09:40:50.429: INFO/ActivityManager(58): Starting activity: Intent ...
- 05-08 09:40:50.649: DEBUG/Activity2(313): onRestart Activity 2
- 05-08 09:40:50.649: DEBUG/Activity2(313): onStart Activity 2
- 05-08 09:40:50.769: DEBUG/Activity2(313): onResume Activity 2
Activity2.onRestart -> Activity2.onStart -> Activity2.onResume
7. 点击comfirm, setResult(RESULT_OK),Activity2.finish(),返回到Activity1
- 05-08 09:41:04.928: DEBUG/Activity2(313): onPause Activity 2
- 05-08 09:41:04.988: DEBUG/Activity1(313): onRestart Activity 1
- 05-08 09:41:04.998: DEBUG/Activity1(313): onStart Activity 1
- 05-08 09:41:04.998: DEBUG/Activity1(313): onResume Activity 1
- 05-08 09:41:05.419: DEBUG/Activity2(313): onStop Activity 2
- 05-08 09:41:05.469: DEBUG/Activity2(313): onDestory Activity 2
Activity2.onPause - > Activity1.onRestart - > Activity1.onStart - > Activity1.onResume - > Activity2.onStop
8. 点击back返回键后
- 05-08 09:41:51.868: DEBUG/Activity1(313): onPause Activity 1
- 05-08 09:41:52.428: DEBUG/Activity1(313): onStop Activity 1
- 05-08 09:41:52.468: DEBUG/Activity1(313): onDestory Activity 1
Activity1 退出:
onPause -> onStop -> onDestory