第一次学习Android中一个很重要的概念,启动模式。文章记录的也只是一些入门知识,随着学习的深入还会有activity启动模式的学习(2)和(3)。 下面分三个小点说一下对启动模式的理解区别以及如何设置。
预备知识
(1)activity是以任务栈的方式进行管理的,栈是一种先进后出的数据结构,栈中的activity只能通过出栈和压栈的方式改变顺序。 (2)启动一个application的时候,系统会默认创建一个任务栈,默认启动的activity都在同一个任务栈中。当启动另一个应用,之前那个任务栈就会被移到后台,成为后台任务栈,而刚启动的那个任务栈就被调到前台,成为前台任务栈。在用户面前显示的始终是前台任务栈中的栈顶activity。
对四种启动模式的理解
Android里面说的启动模式其实就是activity的启动方式。 有下面四种
- standard(默认)
- singleTop(栈顶复用)
- singleTask(栈内复用)
- singleInstance(单例)
standard--系统默认的activity启动模式,不管此时任务栈中的情况如何,每次启动一个activity,系统都会创建它的实例,并将其置于栈顶。
singleTop--另外一种常用的启动模式,当启动一个activity时,系统会检查一下当前任务栈中是否已经存在该activity实例,如果已经存在,就通过onNewIntent获得该实例把它置于栈顶。如果没有。那么创建该activity实例后将其置于栈顶。
singleTask-- 当以这种模式启动activity的时候,需要指定其任务栈。 activityA启动activityB的时候,会先在系统寻找是否存在该栈。
- 不存在,创建栈并创建activity实例置于栈顶。
- 存在,则在栈中寻找是否有B的实例,若有,则就通过onNewIntent获得该实例至于栈顶。无则创建该activity实例后将其置于栈顶。
singleInstance--看到名字就会想到单例模式是吧~是的,确实也是这样的思想。为了充分利用activity实例达到极致,设置这个启动模式后,activityA启动activityB,会专门为activityB创建一个任务栈,并且创建activityB实例至于栈顶。该activity实例便可被系统内的应用共享。
总结
对于时不时想把某个activity展示在用户面前这件事,使用 默认:不管在不在栈顶,都创建(该栈中可能有多个实例)->栈顶复用:若在栈顶,则复用(该栈中可能有多个实例,但相对默认模式,少了点)->栈内复用:瞅瞅这个栈中有没有,有就用,没有就造一个(该栈中只有一个实例)->单例:直接自成一派,创个栈,只有这个activity一个实例并且在栈顶,不管哪个应用程序都能用(该应用程序上下文中只有一个实例)。 弄明白了这几种启动模式后,就需要根据实际情况决定使用哪种启动模式。
具体使用场景
由于本人目前对启动模式的使用比较少,后续有更多再补充。
场景:使通知栏弹出Notification,点击Notification跳转到指定的Activity。 假设现在处于栈顶展示在用户面前的就是这个activity。如果是默认模式,则会再次打开当前的Activity。这样展示在用户面前的效果就会很奇怪。(看起来是闪了一下) 如果使用的启动模式是singleTop,就会避免这种现象的出现。
场景:假设我们的程序中有一个Activity是允许其他程序调用的,我们想让其他程序共享这个Activity的实例。如果使用的启动模式是singleInstance,就可以解决这个问题。
如何设置activity的启动模式
一般有两种方式设置。
- 在manifast文件中通过activity的launchMode进行设置。
- 通过对启动该activity的intent设置标志位实现。
疑惑及解答
1.如何设置不同的任务栈? 3.当activityA以标准模式启动B的时候,B的实例被创建且处于activityA任务栈的顶端,那么这个时候B启动了A(standard)呢? 4.这两种设置方式有什么区别呢?常用的标志位有好几个,组合起来使用又有什么不同的效果呢?
这些个答案等我下一篇文章再继续介绍哈敬请关注android初级开发笔记-- activity启动模式的学习(2)