Android Activity的生命周期分析,网上一抓就是一大把,但是总感觉太泛泛而谈,重复东西太多了。最近收到这样的需求:产品经理要求app的部分设置在用户退出app后再次进入app时,这部分设设置回复默认值,但是,如果用户在应用中切换Activity后,应该保留被改动的设置。可以选择的方案很多,几经调研,分析利弊之后,笔者准备从Activity的生命周期下手,于是,这篇文章诞生了。
根据需求,我理出里需要关注的主要Method:
onCreate(Bundle savedInstanceState)
---- onRestoreInstance(Bundle savdeInstanceState)
---- onSaveInstanceState(Bundle outState)
onDestory()
原因如下:
- onCreate和onDestory是入口和出口,我们可以知道app是否启动或退出
- 但是onCreate有两种情况调用,一种是第一次(这里指完全退出app后)启动这个Activity时,另一种是当这个Activity处于后台并且手机内存不足时,它可能被回收,此时从其他Activity返回时会调用onCreate,只要通过调研,弄清楚onCreate时到底是不是第一次启动这个Activity即可。所以笔者向导里这两个Method:onRestoreInstance() & onSaveInstanceState()
于是写demo,打印日志观察:
case 1 启动app,从mainActivity跳转到Activity2,然后点击返回按钮返回,mainActivity的日志日下:
onCreate() savedInstanceState 此时为null
---- startActivity()
onSaveInstanceState()
onDestory()
---- 从Activity2返回MainActivity
onResume()
case 2 在开发人员选项里打开设置“不保留活动”,步骤同case 1
onCreate() savedInstanceState 此时为null
---- startActivity()
onSaveInstanceState()
onDestory()
---- 从Activity2返回MainActivity
onCreate(Bundle savedInstanceState) savedInstanceState 此时不为null
---- onRestoreInstance(Bundle savdeInstanceState)
onResume()
对比case1和 case2的log,观察到明显的不同
---- onCreate(Bundle savedInstanceState) savedInstanceState 此时不为null
---- onRestoreInstance(Bundle savdeInstanceState)
onResume()
观察日志可以得出结论:如果Activity被回收,再次返回它时,onCreate中会有 savedInstatceState对象,并且onRestoreInstance会被调用。得出结论后,笔者思路也清晰了,要做的就是在onSaveInstanceState中保存一个标记,再onCreat中进行标记判断即可。
笔者不喜欢篇幅过长的技术博客,这样会使阅读者容易疲乏,接下来笔者会整理demo,上传后在博客中更新。
参考资料:
http://developer.android.com/reference/android/app/Activity.html
http://blog.csdn.net/liuhe688/article/details/673340
http://blog.csdn.net/android_tutor/article/details/5772285