Android默认启动模式的LAUNCHER活动?

时间:2013-09-05 12:13:47

标签: android android-activity

launchModelauncher activity的{​​{1}}会被忽略吗? manifest文档说明默认android是“标准”但如果这应用于应用程序的主要活动,这对我来说不是逻辑,因为每次启动应用程序时,另一个{ {1}}将在应用的launchMode中创建。

4 个答案:

答案 0 :(得分:4)

你混淆了两件事。一个是launchMode,另一个是"当用户从HOME屏幕选择应用图标或从最近任务列表中选择任务时会发生什么?#34;。这是完全不同的两件事。

launchMode

每个Activity都有一个指定的launchMode(默认为"standard""multiple"。这告诉Android如何启动此Activity,并且有很多可能有助于launchMode解释的因素。这取决于所使用的Intent中可能指定的其他标志。这取决于请求启动的任务Activity(或者如果从非活动上下文请求启动,例如来自ServiceBroadcastReceiver)。这取决于{{1}的现有实例已经在指定的任务等中激活

从HOME屏幕或已安装的应用程序列表中选择应用程序图标的行为

当用户选择应用图标时,Activity会被startActivity()调用,其中包含以下数据:

  • ACTION = MAIN
  • CATEGORY = LAUNCHER
  • 组件设置为包名称和清单中定义的Intent的类名称,其中ACTION = MAIN和CATEGORY = LAUNCHER
  • 已设置标记ActivityFLAG_ACTIVITY_NEW_TASK

无论要启动FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的{​​{1}}定义如何,使用launchMode调用Activity都会导致以下行为:

如果已有任务的任务亲和力与正在启动的startActivity()匹配(简单来说,如果应用程序已在运行),Android将简单地将现有任务带到前台。就是这样。它不会创建任何Intent的实例。它不会在任何Activity上调用Activity。除了将现有任务置于前台之外,它什么都不做。这就是为什么即使您为启动器onNewIntent()指定Activity,Android也不会在您每次点击应用图标时创建新实例。

如果还没有现有任务的任务亲和力与正在启动的launchMode="standard"匹配(简单来说,如果应用程序尚未运行),Android将创建一个新任务,将Activity启动到该任务中。 Activity在这里没有发挥作用,因为在将单个Activity发布到新任务时,启动模式之间绝对没有区别。 Android总是创建一个新任务,并始终创建launchMode的新实例作为该任务的根。

当用户从最近任务列表中选择任务时,此行为也相同。如果任务仍在运行,Android只会将任务带到前台,不会启动任何新的Activity实例,也不会调用Activity。如果任务不再运行,Android会创建一个新任务并将启动器Activity启动到该任务中。这里唯一的区别是,如果用户从最近任务列表中选择了一个任务,则onNewIntent()中也会设置标志Activity

我希望这能回答你的问题。

有关FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY和一般任务重新定位的详细说明,请参阅this answer

答案 1 :(得分:2)

将除开幕活动之外的所有内容都视为抽象实现。将活动声明为

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

首先打开它。在形成Intent以在活动之间导航时,后续活动是Overriden。覆盖表示为意图标记。

意图附加列表: http://developer.android.com/reference/android/content/Intent.html

使用flags作为命令,否则你将在Manifest中写入。

答案 2 :(得分:0)

你是对的。默认模式是“标准”。

根据android文档

  

*在standard模式下,每次出现“标准”活动的新意图时,都会创建该类的新实例以响应该意图。每个实例处理一个意图。

     

*。如果父活动具有启动模式standard(并且向上意图不包含FLAG_ACTIVITY_CLEAR_TOP),则当前活动及其父活动都从堆栈弹出,并且新实例创建父活动以接收导航意图。

答案 3 :(得分:0)

活动设置为标准模式的行为是一个新的活动将始终创建,以便与发送的每个Intent分开工作。想象一下,如果有10个意图被发送来撰写电子邮件,那么应该启动10个活动来分别为每个意图提供服务。因此,可以在设备中启动无限数量的此类活动。

Android前Lollipop上的行为

标准活动将被创建并放置在堆栈顶部,与发送Intent的任务相同。 例如,当我们将图库中的图像共享到标准活动时,它将堆叠在所描述的相同任务中,尽管它们来自不同的应用程序。 如果我们将应用程序切换到另一个应用程序然后切换回Gallery,我们仍然会看到标准launchMode位于Gallery的任务之上。因此,如果我们需要对Gallery执行任何操作,我们必须首先完成其他活动中的工作。

enter image description here

Android Lollipop上的行为

如果活动来自同一个应用程序,它将像在Lollipop之前一样工作,堆叠在任务之上。 但是如果从其他应用程序发送Intent。将创建新任务,新创建的Activity将作为根活动放置,如下所示。

enter image description here

来自here

的来源