Activity组件的生命周期
2014-06-03 16:37 hellenism 阅读(300) 评论(0) 编辑 收藏 举报一.Activiy组件的三个状态:
1.前台状态(active) : 在屏幕的最上层,页面获得焦点,可以响应用户的操作
2.可视状态(paused) : 不能与用户交互,但是还存在于可视区域内,它依然存在内存中,保存着所持有的数据
3.后台状态(stoped) : 已经不在可视区域内,完全被其他Actiivy覆盖,它依然存在内存中,保存着所持有的数据
当Activity处于可视状态(paused)和后台状态(stoped)时,当系统内存不足时候,会被系统销毁其内存,其中保留的数据全部释放清空,只保留一个基本记录在
导航栈中,当再次回到此Activity时,系统会重新从onCreate事件重新运行一遍,以便创建(或者回复)必要的数据
二.Activity7个回调事件
onCreate
onStart
onRestart
onResume
onPause
onStop
onDestroy
三.3个生命周期循环
完整生命周期:onCreate -> onDestroy
可视生命周期:onStart -> onStop
前台生命周期:onResume -> onPause
四.基于生命周期的数据管理
当系统内存不足时,处于【可回收状态】(可视状态和后台状态)下的Activity会被系统回收,其中的数据全部清空,所以基于Activity的生命周期
管理数据,保证数据安全是非常重要的
当系统主动回收Activity所占的内存时,不会照常回调Activity的生命周期事件。
即onStop,onDestroy事件不会被执行
所以为了保证数据安全,需要在onPause时进行数据的保存
protected void onPause() { writeData(data); }
五.基于生命周期的状态管理
每一个用户控件都有属于自己的状态,比如EditText的Text就是最典型的一个,妥善管理控件状态信息,能够提高用户体验
当程序以外中断(电话呼入),onSaveInstanceState事件会被触发,在此事件中可以保存Activity的一些状态信息,事件提供Bundle,以键值对的形式保存状态
这里的Bundle实例不会持久化保存,只是缓存,如果杀掉程序,则无法再被恢复
@Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); Log.d("test","onSaveInstanceState"); }
与之对应的是
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); Log.d("test", "onRestoreInstanceState"); }
需要注意的是这个两个事件何时回被触发.
onSaveInstanceState事件触发时机:
当activity非用户意愿(比如电话呼入而非Back或finish)被置为可视状态(pause)时候,将会在onPause事件之后调用onSaveInstanceState事件
onRestoreInstanceState事件触发时机:
非用户意愿使得Activity变为可视状态或者后台状态后,又让Activity回到前台状态,是不会触发onRestoreInstanceState事件的,只有
当前Activity真正被系统销毁了,才会发出onRestoreInstanceState事件
将会在onCreate之后触发onRestoreInstanceState事件
六.如何判断一个Activity是新创建的还是被系统回收后再次创建?
1.检测onCreate事件的savedInstanceState字段是否为空
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState!=null) // 被系统回收,再次创建 { status = savedInstanceState.getInt(statusStr); Log.d("test", "status:" + status); } else // 首次创建 { } }
2.判断onRestoreInstanceState事件是否被触发
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); // 此activity被系统回收,再次创建 }
七.页面跳转与外部事件对Activity生命周期的影响
导航到新Activity ,按下Home按钮 ,关闭手机屏幕,都会依次触发: onPause -> onSaveInstanceState -> onStop
当按下Back按钮回退时候,主动执行finish()时候,会依次触发: onPause -> onSaveInstanceState -> onStop -> onDestroy