代码改变世界

Activity组件的生命周期

2014-06-03 16:37  hellenism  阅读(292)  评论(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