一、activity生命周期分析
1.1正常情况下的生命周期
(1)onCreate:表示Activity正在被创建,通常情况下我们会在这个方法里面做一些初始化资源的操作,比如setContentView加载布局以初始化一些数据的操作等。
(2)onRestart:表示Activity正在重新启动,通常情况下,是当前activity从不可见到可见的时候,会调用onrestart,一般情况下这三种情况下会调用onrestart
1)按下home键之后,然后切换回来,会调用onRestart()。
2)从本Activity跳转到另一个Activity之后,按back键返回原来Activity,会调用onRestart();
3)从本Activity切换到其他的应用,然后再从其他应用切换回来,会调用onRestart();
(3)onStart:表示Activity正在被启动,这个时候的Activity已经可见了,只不过还没有出现在前台,无法和用户进行交互。所以你可以理解成,activity已经显示了但是我们还看不到。
(4)onResume:表示Activity已经可见了,并且已经出现在前台,并可以进行交互了,大家要注意的一点是,onStart和onResume都表示Activity可见,但是onStart的时候还在后台,onResume的时候才显示在前台。
(5)onPause:表示Activity正在被停止,正常情况下会紧接着调用onStop方法,但是特殊情况下,你快速返回当前Activity的话就会调用onResume。在这个方法可以做一些不要太耗时的操作,最好在这个方法做一些数据存储,还有动画停止的操作,如果太耗时会影响到Activity的显示,因为这个方法执行完以后才会去调用新Activity的onResume方法。
(6)onStop:表示Activity即将停止,同样的也不要太耗时,适合做一些轻量级的回收工作。
(7)onDestroy:表示Activity即将被摧毁,这是最后一个生命周期的回调,我们可以做一些回收工作和最终的资源释放。
在正常的情况下,生命周期就这上面七个,为了让大家更好的理解,特此抠图一张,供大家理解
这里对上面图片补充几点:
(1)针对一些特定的Activity,第一次启动,回调如下:onCreate-onStart-onResume。
(2)当用户打开了新的Activity或者按Home返回了桌面的话,回调如下:onPause-onStop,这里有一种特殊的情况,如果新的那个Activity采用了透明主题的话,那这个Activity不会返回onStop方法。
(3)当用户返回当前Activity时,回调如下:onRestart-onStart-onResume。
(4)用用户按back键的时候,回调如下:onPause-onStop-onDestory。
1.2 上面说了下正常下得生命周期,下面讲讲异常情况下
(1)资源相关的系统配置发生改变导致Activity被杀死并且重建
举个栗子,横屏和竖屏就会拿到两张不同的图片,在竖屏的情况下,突然切换到横屏,因为系统配置发生了改变,在默认的情况下,Activity就会销毁并重建(这里说的是默认情况),其生命周期如下
当系统配置发生改变后,Activity会被销毁,回调如下:onPause-onStop-onDestory,
由于Activity是在异常情况下被终止的,所以系统会调用onSaveInstanceState方法来保存当前Activity的状态,这个方法会在onStop之前调用,不过和onPause方法没有既定的顺序,有可能在onPause之前也有可能在onPause之后。强调一点,这个方法只会在异常情况下才会调用,正常情况下不会调用这个方法。当Activity被重新创建后,系统会调用OnRestoreInstanceState方法,并把onSaveInstanceState保存的Bundle对象传递到OnRestoreInstanceState方法中。同时要知道的时,在onSaveInstanceState和OnRestoreInstanceState方法中,系统为我们做了一定的恢复工作,比如说,当前Activity的视图结构,输入框的数值,Listview的滚动位置等等,这些View相关的状态系统都能为我们恢复。
(2)资源内存不足,导致低优先级Activity被杀死
这种情况不好模拟,但是数据储存和恢复和(1)是一致的,我在这里讲一下优先级,Activity会按照优先级情况,分为3种:
1)前台Activity——正在和用户交互的Activity优先级别最高。
2)可见但非前台Activity——如当前Activity弹出了一个Dialog框,这个Activity就处于可见但不可交互。
3)后台Activity——被暂停的Activity,比如执行了onStop,优先级最低。
资源不足的时候,系统会按上述优先级去杀死优先级最低的Activity所在的进程。并在后续通过onSaveInstanceState和OnRestoreInstanceState来存储和恢复数据。
二、Activity的四种启动模式
Activity有四种启动模式,分别是:standrad、singleTop、singleTask、singleInstance我们下面来详细介绍
(1)standrad:标准模式,这是系统默认的模式。这个模式呢,每启动一个Activity就会创建一个新的实例,不管这个实例是否存在。这是典型的多实例实现,一个任务栈中可以有多个实例,每个实例也可以属于不同的栈。举个栗子:Activity A启动Activity B(B是标准模式),那么B就会进入到A的栈里面。
(2)singleTop:栈顶复用模式,这个模式呢,只要Activity位于任务栈的栈顶就不会被重新创建。相反如果不在栈顶就会被重新创建。举个栗子:在一个栈里面有四个实例 A B C D A在栈底,D在栈顶,D的启动模式为singleTop,那么假设启动D那么栈内的情况不变,如果D的启动模式为standrad的话,那么D就会被重建栈内就会变成ABCDD了。
(3)singleTask:栈内复用模式。这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动该Activity都不会重新创建一个实例。具体一点就是,当一个singleTask模式的Activity启动后,系统首先会查找是否存在该Activity想要的栈,如果不存在,就重新创建一个栈在创建一个Activity实例把Activity放进去,如果存在那么就把该Activity调到栈顶,如果实例不存在就会创建该Activity的实例并放入栈中。
(4)singleInstance:单实例模式。这是singleTask的加强版,他除了具有singleTask所有的特性外,还加强了一点,那就是具有此模式的实例,只能单独存在于一个栈中,换句话说就是A启动后会为A单独创建一个栈,A独立存在于这个栈中,由于栈的复用,后续的启动都不会重新创建实例。
好啦,启动模式就讲完了,那么我说一下启动模式指定呢
有两种方式,一种是在AndroidMenifest为Activity指定启动模式,如图:
另一种是通过Intent在设置标志位来为Activity设置启动模式,如图:
这两种方式都可以为Activity设置启动模式,不过两者还是有区别的,通过优先级来讲,第二种优先级比第一种高,两种都存在,以第二种为准。
其次两者在范围也有不同,第一种不能设置FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法为Activity指定singleInstance模式。
好啦Activity的生命周期和启动模式就讲到这里了,讲的很基础,第一次开始写就先从基本的开始吧。