Android中launchMode的理解

最近在项目中遇到退出程序的问题,在以前做过的项目中基本上退出的做法要么是在主界面中增加退出按钮,要么就使用Android系统默认的堆栈管理(back)就行了,而这次项目的要求是在程序内部退出整个程序。

开始的做法是在需要退出程序的地方调用System.exit(0)和android.os.Process.killProcess(Process.myPid())方法,发现都不行,最后在网上看到一篇介绍完美退出程序的文章,主要是用到了Intent启动Activity的时候加入了一个FLAG_ACTIVITY_CLEAR_TOP这样的flag,字面意思的理解大致是说清除顶部的Activity。下面先从FLAG_ACTIVITY_CLEAR_TOP开始说起。

假设此时stack中有ABCD四个Activity,此时D再跳转到A并且带了一个FLAG_ACTIVITY_CLEAR_TOP这样的flag(通过setFlags设置),会发现此时栈中只有A了(因为按返回键之后就退出了程序了),而且onNewIntent方法也没有调用,当通过在manifest中设置A的launchMode为singleTop之后,效果一样,不过onNewIntent方法可以执行到。这里对FLAG_ACTIVITY_CLEAR_TOP参数总结如下:会清除所要跳转的目标Activity以上所有的Activity,目标Activity存在不销毁,如果目标Activity的launchMode为singleTop的话,onNewIntent会执行到,其余情况执行不到。

接下来具体介绍四种launchMode的区别。

1、standard,这是Android默认的启动方式,启动一个就创建一个Activity,这里就不做介绍了。

2、singleTask,如果stack中是这样的情况,A(singleTask)、B、C,此时C跳转到A,由于A已经存在,A上面的BC出栈(即销毁掉),此时stack中只有一个A。

3、singleTop,如果stack中是这样的情况,A(singleTop)、B、C,如果从C跳转到A,此时的情况跟standard一样,再创建一个A置于栈顶,stack中的情况是:A、B、C、A;但是如果栈中只有A(singleTop),然后从A跳转到A,由于栈中A存在且A处于栈顶,跳转后栈中还是只有一个A。

4、singleInstance,如果A的launchMode为singleInstance,再由A启动B,会发现两个Actvity的taskId不是一样的,也就证明了两个Activity不在一个Task中,如果再从B启动C,C再启动A,按back键时会发现退栈的顺序为:A–>C—>B。看下图的描述:

有兴趣的可以写个简单的demo测试验证下。