一:简单的概念
四种启动模式:
Activity启动模式设置:
在清单文件中,
Activity的四种启动模式:
1. standard
默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
2. singleTop
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
3. singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
4. singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
二:上代码
(1)ActivityA和ActivityB都是standard启动模式,即默认的情况
代码这里就不贴出来了,很简单就是ActivityA点击按钮启动ActivityB,ActivityB点击按钮启动ActivityB,我们看的是ActivityB启动几次,结果如下:
08-28 12:25:31.265 20523-20523/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB执行了onCreate
08-28 12:25:41.080 20523-20523/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB执行了onCreate
08-28 12:25:42.898 20523-20523/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB执行了onCreate
然后点击后退键:
08-28 12:26:16.199 20523-20523/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB执行了onDestroy
08-28 12:26:17.613 20523-20523/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB执行了onDestroy
08-28 12:26:18.725 20523-20523/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB执行了onDestroy
这说明在standard模式下,每当通过startActivity创建ActivityB的时候,ActivityB都创建了新的实例.
(2)ActivityA:standard; ActivityB:singleTop
结果如下:
08-28 12:44:58.904 29544-29544/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB 执行了 onCreate
08-28 12:45:01.832 29544-29544/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB 执行了 onNewIntent
08-28 12:45:03.922 29544-29544/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB 执行了 onNewIntent
我的操作是:由A启动B,由B再启动B,再启动B.第一次启动ActivityB的时候走了onCreate()方法,后面再启动ActivityB的时候,由于这个时候ActivityB已经处于栈顶的位置,所以不会再创建ActivityB的实例,而是会调用onNewIntent()方法.
(3)ActivityA:singleTask; ActivityB:standard; ActivityC:standard;
08-28 13:49:52.909 23695-23695/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityA 执行了 onCreate
08-28 13:49:55.958 23695-23695/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB 执行了 onCreate
08-28 13:49:57.790 23695-23695/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityC 执行了 onCreate
08-28 13:50:01.148 23695-23695/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB 执行了 onDestroy
08-28 13:50:01.480 23695-23695/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityC 执行了 onDestroy
我的操作是由A启动B,由B启动C,由C启动A,我们看到当由C启动A的时候,B和C执行了onDestory()方法,这说明设置为singleTask的A,当再次启动时,会把在它上面的Activity干掉
这个时候点击后退键:
08-28 13:50:04.598 23695-23695/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityA 执行了 onDestroy
直接退出了程序,因为这个时候任Activity栈里面只有一个A
(4)ActivityA:standard; ActivityB:standard; ActivityC:singleInstance;
08-28 14:00:22.003 1282-1282/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityA执行了onCreate
08-28 14:00:22.003 1282-1282/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityA的taskId是272
08-28 14:00:26.480 1282-1282/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB执行了onCreate
08-28 14:00:26.481 1282-1282/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityB的taskId是272
08-28 14:00:29.573 1282-1282/com.dgtech.sss.lanuchmodedemo I/System.out: ActivityD的taskId是273
我的操作是:由A启动B,由B启动D,从中我们可以看出A,B的任务栈id相同,D出现在了一个新的任务栈,这就说明设置了singleInstance启动模式会创建一个新的任务栈,而且自己独享
三.补充
这里涉及的知识点很多,比如Activity的管理机制,taskAffinity属性,这里就不展开说了,展开说的话篇幅就太长了,我会在后面的文章中涉及到