Android学习之Activity的四种启动模式与特点

版权声明:欢迎转载!请注明出处! https://blog.csdn.net/u011726984/article/details/49456287

Acitivty的四种启动模式与特点

activity有四种启动模式,分别为:

  1. standard
  2. singleTop
  3. singleTask
  4. singleInstance

可以和activity的flags(通过Intent对象调用FLAG_ACTIVITY_* ,*代表常量)结合使用。

standard 和 singleTop

standard

默认。系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例

singleTop

如果当前任务的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建 Activity 的新实例。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例(但前提是位于返回栈顶部的 Activity 并不是 Activity 的现有实例)。

一个activity的“ standard ”或“ singleTop “启动模式可以多次实例化实例可以属于任何任务(task)并且可以位于activity栈的任何地方

通常情况下,他们调用 startActivity() 启动(除非Intent对象包含一个 FLAG_ACTIVITY_NEW_TASK 指令,在这种情况下,activity将选择一个新的任务(task))。

区别

“ standard ”和“ singleTop ”模式各不同于对方,只在一个方面:

每次有新的Intent,对于”standard ”的activity ,会创建一个类的新实例对此Intent作出回应。 每个实例处理一个单一的Intent对象。

同样,一个“ singleTop ”的activity的新实例也创建来处理一个新的Intent对象。 然而,如果目标任务已经有一个现有的activity实例在其栈的顶部,该实例将接收这个新的Intent(通过调用onNewIntent()),而不是创建一个新的activity实例。

在其它情况下,例如,如果现有的” singleTop ”启动模式的activity实例是在目标的任务,而不是在其栈顶部,或者如果它是在一个堆的顶部,而不是在目标任务中,那么一个新activity实例将被创建并push到栈顶。

同样地,如果在当前任务中,你向上导航到一个activity,这个行为是通过父activity的启动模式决定的

  • 如果父activity启动模式为singleTop (或者向上的Intent包含FLAG_ACTIVITY_CLEAR_TOP),这个父activity会被带到栈顶,并且它的状态也被保存。这个导航intent是通过父activity的onNewIntent()方法接收的。

  • 如果父activity的启动模式为standard (或者向上的Intent不包含FLAG_ACTIVITY_CLEAR_TOP),当前activity和父activity都会被pop出栈,并且一个新的父activity实例被创建接收这个导航Intent。

实战

manifest清单:

<activity
    android:name=".ActivityA"
    android:label="@string/activity_a">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>
<activity
    android:name=".ActivityB"
    android:label="@string/activity_b"/>

<activity android:name=".ActivityC"
    android:label="@string/activity_c"/>

没有指定launchMode默认为standard模式,启动app:

点击启动B按钮:

我们发现,A,B都在任务4中,此时,再启动B,如下:

我们发现,B出现了两个实例,此时,按返回键如下:

我们发现,会回退到了之前第一次启动的实例B。

此时,再按返回键如下:

我们发现,会回退到了之前首次启动的实例A。

改变A的启动模式为singleTop,重启app:

启动B

再启动B

按返回键

再按返回键回到A

到此为止和前面的步骤一样,而且结果也一样,下面重点来了,在A界面启动A,如下:

我们可以看到,A的实例并没有改变,因为A的启动模式为singleTop,A当前在任务栈顶,当启动A时,是不会创建新实例,而是通过调用其onNewIntent方法启动当前已存在的实例。
此时,按返回键将退出app。

singleTask 和 singleInstance

singleTask

系统创建新任务并实例化位于新任务底部的 Activity。但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的 onNewIntent() 方法向其传送 Intent,而不是创建新实例。一次只能存在 Activity 的一个实例。

注:尽管 Activity 在新任务中启动,但是用户按“返回”按钮仍会返回到前一个 Activity。

singleInstance

与 “singleTask” 相同,只是系统不会将任何其他 Activity 启动到已经包含实例了的任务中。该 Activity 始终是其任务唯一仅有的成员;由此 Activity 启动的任何 Activity 均在单独的任务中打开。

相比之下,“ singleTask ”和“ singleInstance ”启动模式的activity 只能启动在一个任务中。 他们总是在activity栈的顶部。 此外,该设备仅维持一次并且仅一个activity的实例–仅在一样的任务中

区别

“ singleTask ”和“ singleInstance ”模式也互不相同只在一个方面:

singleTask 模式的activity允许其他activity是它的任务的一部分。 它总是在其任务的顶部,但是其他activities(一定是” standard ”和“ singleTop ” 模式的activities)可以运行在这一任务中。

一个“ singleInstance ” 的activity,另一方面,不允许其他activity是它任务的一部分* 仅有一个activity实例在该任务*。 如果它启动另一个activity,那个activity是被分配给一个不同的任务–就像使用FLAG_ACTIVITY_NEW_TASK一样。

实战

manifest清单

<activity
    android:name=".ActivityA"
    android:label="@string/activity_a"
    android:launchMode="standard">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

<activity
    android:name=".ActivityB"
    android:label="@string/activity_b"
    android:launchMode="singleTask"/>

<activity android:name=".ActivityC"
    android:label="@string/activity_c"
    android:launchMode="standard"/>

将B的启动模式设为singleTask,启动app:

启动B

再启动B,结果还是如上图所示,此时按返回键将回到A。

再从A启动B:

此时,启动C

此时,再启动B:

可以看到,B的实例和之前的一样,说明,singleTask模式下的B是单例的。

将以上B的启动模式改为singleInstance,其它不变,启动app,

启动B:

从以上,可以看到,A和B是在不同的任务中的,此时再启动B,结果还是如上图,

说明,singleInstance模式下的B和其他activity是在不同的任务中,并且是单例的。

此时,启动A(注意不是重启,是在上次B界面中启动A),再启动B:

可以看到,B又启动了一个任务,并在其任务栈顶。

在此中断。。。重启app:

A:

此时,启动B:

此时,启动C:

可以看到A和C在同一任务中,而B在任务20中,因此,此时按返回键返回的是A,而不是B。

这也说明了下面的一个问题:

singleTask和singleInstance启动模式的activity导致的交互模型,在开发中是很难掌控的。


如下表所示, standard是默认模式并且适用于大多数类型的activity。

SingleTop也是一种常见的并且有用的启动模式对于许多类型的activities。

其它模式- singleTask和singleInstance - 不适合大多数应用 ,因为它们导致的交互模型,很可能是用户不熟悉的并且和其他大多数的应用有很大不同。

不管你选择的哪种启动方式,确保启动期间测试这个activity的可用性并且导航回到它当从其他activities和任务中使用后退按钮。

Demo

Demo下载:
http://download.csdn.net/detail/u011726984/9218775

PS:http://blog.csdn.net/liuhe688/article/details/6754323/ 大家可以配合此文互相理解(●’◡’●)

如有不足或遗漏请评论指出,谢谢!

官方文档:
http://developer.android.com/intl/zh-cn/guide/topics/manifest/activity-element.html#lmode

阅读更多

扫码向博主提问

一大三千

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Java
  • Python爬虫
  • Linux
  • 微服务
  • Spring
去开通我的Chat快问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页