Activity细粒度生命周期

onSaveInstanceState与onRestoreInstanceState的作用:

在资源紧张的情况下,系统会选择杀死一些处于非栈顶的Activity来回收资源。 为了能够让这些可能被杀死的Activity能够在恢复显示的时候状态不丢失,所以需要在Activity从栈顶往下压的时候提供onSaveInstanceState的回调用来提前保存状态信息。

而onRestoreInstanceState则是在这个Activity真的回收掉之后的恢复显示阶段用来恢复之前保存的数据。

onSaveInstanceState与onRestoreInstanceState的调用时机:

只要某个Activity是做入栈并且非栈顶时(启动跳转其他Activity或者点击Home按钮),此Activity是需要调用onSaveInstanceState的, 如果Activity是做出栈的动作(点击back或者执行finish),是不会调用onSaveInstanceState的。

只有在Activity真的被系统非正常杀死过,恢复显示Activity的时候,就会调用onRestoreInstanceState。 onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之间调用。

activity的生命周期:
onCreate –> onContentChanged –> onStart –> onPostCreate –> onResume –> onPostResume –> onPause –> onStop –> onDestroy

onContentChanged()是Activity中的一个回调方法
当Activity的布局改动时,即setContentView()或者addContentView()方法执行完毕时就会调用该方法, 例如,Activity中各种View的findViewById()方法都可以放到该方法中。
onPostCreate方法是指onCreate方法彻底执行完毕的回调,如果Activity实例是第一次启动,则onPostCreate(Bundle)不调用,否则,以后的每次重新启动都会调用.
onPostResume类似.

Sample Code

从ActivityA启动ActivityB执行顺序是:A:onCreate -> A:onStart -> A:onResume -> B:onCreate -> B:onStart -> B:onResume -> A:onSaveInstanceState –> A:onStop。
正常流程从ActivityB点击Back按钮或者是触发finish方法回退到ActivityA,执行顺序是:B:finish –> B:onPause –> A: onRestart –> A:onStart -> A:onResume -> B: onStop –> B:onDestroy。
若启动ActivityB之后,选择点击Home按钮,程序退到后台,那么执行顺序是:B:onPause -> B:onSaveInstanceState -> B:onStop。
程序在后台的时候,选择主动杀死程序进程,然后再从桌面点击应用启动,会显示之前的ActivityB,执行顺序是:B:onCreate -> B:onStart –> B:onRestoreInstanceState - > B:onResume。
点击Back按钮或者是执行Activity B里面提供的finish方法:B:finish –> B:onPause –> A:onCreate -> A:onStart -> A:onRestoreInstanceState -> A:onResume -> B:onStop -> B:onDestory。
最后再点击Back按钮或是执行Activity A里面的finish方法退出程序:A:finish -> A:onPause –> A:onStop -> A:onDestory。

tips: 由于onSaveInstanceState()方法方法不一定会被调用, 因此不适合在该方法中保存持久化数据, 例如向数据库中插入记录等. 保存持久化数据的操作应该放在onPause()中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值