Android 启动模式

Android应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=””设置。

1. Standard模式(默认)
Android activity 默认的启动模式, 每次启动一个activity 都是重新创建一个新的实例,并且置于栈顶,点击Back键, activity销毁的顺序按照出栈顺序(LIFO)执行。

2. SingleTop模式
这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。singleTop适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。注:Activity2 的launchMode 为singleTop。

3. SingleTask模式
如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newIntent()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。注:Activity2 的launchMode 为singleTask。


4. SingleInstance模式
当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newIntent()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。注:Activity2 的launchMode 为singleInstance。

总结:
standard:默认模式,始终创建新的实例。
singleTop: 要激活的Activity处于栈顶,则不新建实例,重用该实例,否则新建实例。
singleTask: 检查要激活Activity在栈中是否存在,如果存在把该实例pop 到栈顶,该实例栈以上的实例出栈,如果不存在,新建一个栈并把该实例置于栈底。
singleInstance:检查要激活Activity在栈中是否存在,不存在,新建一个栈并把该实例置于栈底,存在直接使用该实例,singleInstance的实例在所在的栈的栈底,并且该栈中只有唯一该对象。

signleTask 和singleInstance的区别
这两种启动模式存在某些共同点,也是稍微难以理解的两种模式。
相同点:
1. 都只存在唯一的实例
2.存在实例的时候都是会新建一个栈,并且把新建的对待置于栈底。
不同点:
1. singleTask 实例所在的栈中可以存放其他的实例,singleInstance 实例只存在其本身一个实例
2. ingleInstance表示该Activity在系统范围内“实例唯一”。由此我们发现,singInstance和singleTask主要区别在与系统范围内的“实例唯一”还是当前Activity栈“实例唯一”

More