Activity详解
1.Activity形态:
a.Active/Running:这时候,Activity处于Activity栈的最顶层,可见,并于用户进行交互。
b.Paused:当Activity失去焦点,被一个新的非全屏的Activity或者一个透明的Activity放置在栈顶时,Activity就转换为Paused形态了。比如我们在手机浏览器中浏览信息时,这时候弹出一条短信内容,那么这种情况下就是短信所在的Activity使得浏览器所在的Activity由Active转换为Paused状态;
c.Stopped:如果一个Activity被另一个Activity完全覆盖,那么Activity就会进入Stopped状态,此时,它不可见,但依旧保存了所有状态信息。这个可以理解为当我们在浏览器浏览信息时,突然想要边听歌边浏览信息,那么这时我们按下home键(注意不能是back键),这时浏览器所在的Activity便为stopped状态,当我们再回去但浏览器时,浏览器还是保留着之前浏览着的信息。
d.killed:当Activity被系统回收掉或者Activity从来没有创建过,Activity就处于Killed状态。
2.Activity的生命周期:
a.三种稳定的状态:
- Resumed:这个状态即为前面所说的Active/Running状态,此时Activity处于栈顶,处理用户的交互
- Paused:当Activity的一部分被挡住的时候进入这个状态,这时候Activity不会接受用户输入
- Stopped:当Activity完全被覆盖式,此时Activity不可见,仅在后台运行。
b.Activity的启动和销毁过程
- 启动:oncreate()->onStart()->onResume()最终停留在Resumed状态,完成启动。
- 销毁:直接调用onDestroy(),完成销毁
c.Activity的暂停和恢复过程:onPause()->onResume()
d.Activity的停止和恢复过程:onPause()->onStop()->onRestart()->onResume();
3.Android任务栈
a.任务栈的认识:我们知道一个android应用程序通过会拆分为多个Activity,而各个Activity之间通过intent之间进行连接,而Android系统,通过栈结构来保存整个应用程序的Activity,其中栈底的元素是整个任务栈的发起者。
b.当一个APP启动时,如果当前环境中不存在该APP的任务栈,那么系统就会创建一个任务栈。关于栈的结构是满足“后进先出”。
4.AndroidMainifest启动模式
standard:默认的启动方式,创建的新的Activity会覆盖在Activity上,我们来看下面的一个例子:
如上图,我们存在Activity A和B,上图的含义为首先由A跳转到B,然后再由B跳转回A;
那么这种情况下,其对应的栈如下:我们发现当从B跳转回A时,并不是回到原来的old A中,而是创建创建了一个A放在栈顶
singleTop模式:在启动activity时,系统会判断当前栈顶是否为要启动的activity,如果是,则直接引用,否则创建一个新的activity。
singleTask:在启动activity时,检测整个activity栈中是否存在需要启动的栈,如果存在,则将该activity置于栈顶,并将该activity以上所有的activity都销毁。
singleInstance:这种启动模式比较特殊,因为它会启动一个新的任务栈,将activity放置在这个新的任务栈中,并保证不会有其他的activity实例进入。
关于更多详细的讲解,推荐下面这个大牛的博客:
四种启动模式详解
5.Intent Flag启动模式
- 其实我们设置启动模式除了在mainifest中实现以外,还可以通过设置Intent的Flag来设置一个Activity的启动模式。
- Intent.FLAG_ACTIVITY_NEW_TASK:使用一个新的Task来启动一个Activity。
- FLAG_ACTIVITY_SINGLE_TOP:这个和上面的singTop模式是一致的
- FLAG_ACTIVITY_CLEAR_TOP:类似singleTask模式
- FLAG_ACITVITY_NO_HISTORY:这种模式下,当activity启动其他activity时,该activity就会消失,即不会保留在activity栈中。
6.清空任务栈
- 在mainifest文件中的标签中可以使用下面的几种属性来清理任务栈;
- clearTaskOnLaunch:每次返回该activity时,都会将该activity之上的所有activity都清除。
- finishOnTaskLaunch:当离开这个activity所处的Task时,用户再返回时,该activity会被finish掉。
- alwaysRetainTaskState:设置为true时,将不接受任何清理命令,一直保持当前Task状态。