Activity生命周期要点分析

来源:互联网 发布:淘宝特惠群怎么赚钱 编辑:程序博客网 时间:2024/05/18 01:45

最近从头开始安卓的进阶学习,这是第一篇博客,那就从最基础的Activity开始说起吧:
Activity的生命周期分为两个部分,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。

1.典型生命周期

所谓典型生命周期,是指在有用户参与的情况下Activity所经过的生命周期的改变。
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()。

@Overrideprotected 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()后面调用,谷歌官方推荐这种方式。

@Overrideprotected 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来存储和恢复数据。

0 0
原创粉丝点击