Activity启动模式

2017-08-28  本文已影响65人  选一个昵称这么难

一:简单的概念 

 四种启动模式: 

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属性,这里就不展开说了,展开说的话篇幅就太长了,我会在后面的文章中涉及到

上一篇下一篇

猜你喜欢

热点阅读