Home&Back onPause onStop等执行顺序

Activities是由Activity stack管理的。当一个新的Activity被启动,它就会处于stack的top位置,成为当前运行的Activity。而前一个Activity依然保留在stack里面,当需要调用这个Activity时就会回到stack的top位置成为当前运行的Activity。
 
    一个Activity有4个基本状态:
   1. active / running 状态,当Activity处于当前屏幕时;
 
   2. paused 状态,当Activity失去焦点但对用户依然可见时;即是,一个非全屏或者透明的Activity在该Activity的屏幕上面,并成为了当前的焦点。而paused的Activity依然是alive状态的,它保留着所有的状态和成员信息并连接至窗口管理器,但当系统处于极低内存的情况下,仍然可以杀死这个Activity。
 
   3. stopped 状态,当Activity完全被另一个Activity覆盖时;它仍然保留所有的状态和成员信息。但它不再被用户可见,所以它的窗口将被隐藏,当其它地方需要内存,则系统经常会杀死这个Activity。
 
   4. 当Activity是paused或者stopped状态时,系统可以通过要求它结束(调用它的finish()方法)或直接杀死它的进程来将它驱出内存。当它再次为用户可见的时候,它只能完全重新启动并恢复至以前的状态。

activity_lifecycle

   要注意的是, 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,就会看到
 
 
  1. 05-08 09:39:48.389: DEBUG/Activity1(313): onCreate   Activity 1 
  2. 05-08 09:39:48.399: DEBUG/Activity1(313): onStart    Activity 1 
  3. 05-08 09:39:48.399: DEBUG/Activity1(313): onResume   Activity 1 
   这说明一般Activity的启动顺序是 onCreate -> onStart -> onResume
 
  2. 点击back返回键后
 
 
  1. 05-08 09:40:04.129: DEBUG/Activity1(313): onPause    Activity 1 
  2. 05-08 09:40:04.628: DEBUG/Activity1(313): onStop     Activity 1 
  3. 05-08 09:40:04.659: DEBUG/Activity1(313): onDestory  Activity 1 
    退出当前Activity时,onPause -> onStop -> onDestory
 
  3. 再次启动Activity
 
 
  1. 05-08 09:40:18.249: DEBUG/Activity1(313): onCreate   Activity 1 
  2. 05-08 09:40:18.249: DEBUG/Activity1(313): onStart    Activity 1 
  3. 05-08 09:40:18.259: DEBUG/Activity1(313): onResume   Activity 1 
  和一般启动的顺序是一样的
 
  4. 从Activity1启动Acitivity2
 
 
  1. 05-08 09:40:25.477: DEBUG/Activity1(313): onPause    Activity 1 
  2. 05-08 09:40:25.687: DEBUG/Activity2(313): onCreate   Activity 2 
  3. 05-08 09:40:25.687: DEBUG/Activity2(313): onStart    Activity 2 
  4. 05-08 09:40:25.719: DEBUG/Activity2(313): onResume   Activity 2 
  5. 05-08 09:40:26.277: DEBUG/Activity1(313): onStop     Activity 1 
    Activity1.onPause -> Activity2.onCreate -> Activity2.onStart -> Activity2.onResume ->Activity1.onStop
 
  5. 点击Home键回到桌面
 
 
  1. 05-08 09:40:31.777: DEBUG/Activity2(313): onPause    Activity 2 
  2. 05-08 09:40:32.658: DEBUG/Activity2(313): onStop     Activity 2 
   Activity2.onPause - > Activity2.onStop
 
  6. 回到原来的程序
 
 
  1. 05-08 09:40:50.429: INFO/ActivityManager(58): Starting activity: Intent ... 
  2. 05-08 09:40:50.649: DEBUG/Activity2(313): onRestart  Activity 2 
  3. 05-08 09:40:50.649: DEBUG/Activity2(313): onStart    Activity 2 
  4. 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
 
 
  1. 05-08 09:41:04.928: DEBUG/Activity2(313): onPause    Activity 2 
  2. 05-08 09:41:04.988: DEBUG/Activity1(313): onRestart  Activity 1 
  3. 05-08 09:41:04.998: DEBUG/Activity1(313): onStart    Activity 1 
  4. 05-08 09:41:04.998: DEBUG/Activity1(313): onResume   Activity 1 
  5. 05-08 09:41:05.419: DEBUG/Activity2(313): onStop     Activity 2 
  6. 05-08 09:41:05.469: DEBUG/Activity2(313): onDestory  Activity 2 
   Activity2.onPause - > Activity1.onRestart - > Activity1.onStart - > Activity1.onResume - > Activity2.onStop
 
   8. 点击back返回键后
 
 
  1. 05-08 09:41:51.868: DEBUG/Activity1(313): onPause    Activity 1 
  2. 05-08 09:41:52.428: DEBUG/Activity1(313): onStop     Activity 1 
  3. 05-08 09:41:52.468: DEBUG/Activity1(313): onDestory  Activity 1 
  Activity1 退出: onPause -> onStop -> onDestory
 

保存activity状态

   保存activity状态,是为了方便用户重新打开程序时,能够回到上次离开时的状态。这里面涉及到的方法有:
    protected void onSaveInstanceState (Bundle outState)
   protected void onRestoreInstanceState (Bundle savedInstanceState)
   当一个Activity被kill之前,它可以调用onSaveInstanceState()来保存当前activity的状态信息,它会将一个以名称-值对方式记录了activity动态状态的 Bundle对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState()。这两个方法的内容一般是把要临时保存的数据放到Bundle里面,或者从里面拿出来。
   要注意的是,onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法。它们并不是总会被调用。比如说,Android会在activity易于被系统销毁之前调用 onSaveInstanceState(),但用户动作(比如按下了BACK键)造成的销毁则不调用。在这种情况下,用户没打算再次回到这个activity,所以没有保存状态的必要。因为onSaveInstanceState()不是总被调用,所以你应该只用它来为activity保存一些临时的状态,而不能用来保存持久性数据。 而是应该用onPause()来达到这个目的:在onPause()里面调用自定义命名的函数saveState(),在saveState里面保存数据到数据库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值