您的位置:首页 > 其它

Activity生命周期要点分析

2016-10-29 15:45 232 查看
最近从头开始安卓的进阶学习,这是第一篇博客,那就从最基础的Activity开始说起吧:

Activity的生命周期分为两个部分,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。

1.典型生命周期


所谓典型生命周期,是指在有用户参与的情况下Activity所经过的生命周期的改变。



主要流程大家都知道,这里提出两个问题,大家可以考虑下:

问题1:onStart和onResume,onPause和onStop这两个方法看起来都很类似,又有什么区别呢?

问题2:如果从一个Activity A 去打开另一个Activity B,那么到底是先执行A的onPause还是B的onResume?

先说第一个问题,onResume和onPause是从是否位于前台的角度来回调的,它们的侧总点是Activity是否可见,注意:onResume和onPause的Activity都是可见的不过onResume的时候Activity才显示到前台。通俗点说Activity位于前台的等级比Activity可见的高。onStart和onStop是从Activity是否位于前台这个角度来回调的。

再说第二个问题,可以从源码中得到解释。启动Activity的请求由Instrumentation来处理,然后它通过Binder向AMS(ActivityManagerService)发请求,AMS内部维护着一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。

2.异常生命周期

2.1当一个activity的config改变时,Activity就会被销毁然后重建


而我们最熟悉的config的改变就是屏幕方向改变,系统语言改变,还有键盘可见改变了。当然如果是异常退出google还是想了办法解决的,如上图所示,在onstop前系统会调用onSaveInstanceState()来保存当前activity的状态,不过只保存了视图,如果想保存其他数据,就需要你自己复写onSaveInstanceState()。

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在这里我们可以把我们需要保存的东西给写入Bundle
//.......
}


保存完数据后,接下来就是数据的读取,读取数据有两个地方,第一个地方就是我们熟悉的onCreate()中,注意这里要判断savedInstanceState,因为它一般为null。

@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
//取出数据 想干嘛就干嘛吧
}
}


第二个地方就是onStoreInstanceState(),它在onStart()后面调用,谷歌官方推荐这种方式。

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}


2.2资源内存不足导致低优先级的Activity被杀死


这种情况我们不好模拟,但是其数据存储和恢复的过程和上述完全一致。这里我们了解下Activity的优先等级情况。Activity的优先等级从高到低可以分为三种:

(1)前台Activity—正在和用户交互的Acivity,优先等级最高。

(2)可见但是非前台Activity—比如Activity弹出一个透明Activity,虽然Activity可见但是位于后台无法和用户交互。

(3)后台Activity—已经被暂停的Activity,比如执行了onStop,优先级最低。

当系统内存不足时,系统就会按照上面的优先等级去杀死目标Activity所在的进程,并在后续通过onSaceInstanceState和onRestoreInstanceState来存储和恢复数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: