Android之Activity

来源:互联网 发布:win10手机共享网络usb 编辑:程序博客网 时间:2024/05/17 18:18

一.正常情况下的生命周期分析
这里写图片描述
1.对于一个特定的Activity,第一次启动,回调如下:onCreat->onStart->onResume。
2.当用户打开新的Activity或切换到桌面是,回调如下:onPause->onStop。(这里有一种特殊情况,如果新Activity采用了透明主题,那么当前Activity不会回调onStop)。
3.单用户再次回到原Activity时,回调如下:onRestart->onStart->onResume。
4.当用户按下back回退键时,回调如下:onPause->onStop->onDestory。
5.onStart和onResume,onPause和onStop看起来差不多,甚至我们可以只保留其中的一对,当Android系统之所以这么设计的原因就是:onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的,除了这个,在实际使用中无区别。
6.从A界面启动B界面,执行顺序为:A.onPause->B.onCrest->B.onStart->B.onResume->A.onStop(这里用A.onPause代指A这个Activity执行onPause这个方法)。

二.异常情况下的生命周期分析
1.资源相关的系统配置发生改变导致Aactivity被杀死并重新创建(比如旋转屏幕会更换图案的资源)
这里写图片描述
当系统配置发生改变后Activity会背销毁,期onCreate、onStop、onDestroy均会被调用,系统也会调用onSaveInstanceState来保存当前Activity的状态(在onStop之前调用,而且如果Activity正常结束不会调用这个函数)。之后当Activity重新创建是会调用onRestoreInstanceState,并且把onSaveInstanceState方法所保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方,两者的区别是onRestoreInstanceState一旦被调用其参数Bundle saveInstanceState一定是有值的,而onCreate则需要判断其是否为空,所以官方推荐使用onRestoreInstanceState来恢复数据。从时序上来讲,onRestoreInstanceState在onStart之后。
某些情况下如果我们不想在系统配置改变后重新创建Activity,可以给Activity指定configChanges属性。比如不想屏幕旋转时重建Activity,就给其添加orientation属性。
这里写图片描述
2.资源内存不足导致低优先级的Activity被杀死
优先级最高–前台Activity,正在和用户交互的Activity
优先级次之–可见但非前台Activity(比如Activity弹出一个对话框,导致Activity可见但是位于后台不可以与用户交互)
优先级最低–后台Activity,已经被暂停的Activity,比如执行了onStop函数
当系统内存不足时系统会按照优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数数据。如果一个进程没有四大主件在执行,那么很快就会被系统杀死。因此,一些后天工作不适合脱离四大主件而独自在后台执行,比较好的方法是将后台工作放在Service中从而保证进程有一定的优先级。

三.启动模式(launchMode)
1.standard:标准模式。这是系统的默认模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在,一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。在这个模式中,谁启动这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。比如Activity A启动Activity B(B是标准模式),那么B就会进入A所在的栈中。(tip:当我们用ApplicationContext去启动standard模式的Activity的时候回报错,因为非Activity类型的Context并没有所谓的任务栈,解决办法就是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样就会为其创建一个新的任务栈,此时待启动Activity实际上是以singleTask模式启动的。)
2.singleTop:栈顶复用模式。在这个模式下,如果新的Activity已经位于栈顶则不会被重新创建。(例如,要创建D,已有栈ABCD,则栈还是ABCD,若为standard则为ABCDD)
3.singleTask:栈内复用模式。这是一种单实例模式,只要Activity在一个栈中存在,那么多次启动Activity都不会被重新创建。
a.s1栈中有ABC,这时以singleTask启动D,所需栈为s2,由于s2和D都不存在,则依次创建任务栈S2和实例D
b.s1栈中有ABC,这时以singleTask启动D,所需栈为s1,则将实例D直接入栈到s1
c.s1栈中有ADBC,这时以singleTask启动D,所需栈为s1,此时不会重新创建D,会把s1栈中的D切换到栈顶并调 用其onNewIntent方法,而且singelTask有clearTop效果,所以最后s1栈内为AD。
4.singleInstance:单实例模式。加强的singleTask模式,除了具有singleTask模式的所有特点外,还有一点,就是具有此种模式的Activity只能单独地位于一个任务栈中。

0 0