美文网首页
Activity启动模式

Activity启动模式

作者: 选一个昵称这么难 | 来源:发表于2017-08-28 12: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属性,这里就不展开说了,展开说的话篇幅就太长了,我会在后面的文章中涉及到

    相关文章

      网友评论

          本文标题:Activity启动模式

          本文链接:https://www.haomeiwen.com/subject/ompyjttx.html