launchMode
中launcher activity
的{{1}}会被忽略吗?
manifest
文档说明默认android
是“标准”但如果这应用于应用程序的主要活动,这对我来说不是逻辑,因为每次启动应用程序时,另一个{ {1}}将在应用的launchMode
中创建。
答案 0 :(得分:4)
你混淆了两件事。一个是launchMode
,另一个是"当用户从HOME屏幕选择应用图标或从最近任务列表中选择任务时会发生什么?#34;。这是完全不同的两件事。
launchMode
每个Activity
都有一个指定的launchMode
(默认为"standard"
或"multiple"
。这告诉Android如何启动此Activity
,并且有很多可能有助于launchMode
解释的因素。这取决于所使用的Intent
中可能指定的其他标志。这取决于请求启动的任务Activity
(或者如果从非活动上下文请求启动,例如来自Service
或BroadcastReceiver
)。这取决于{{1}的现有实例已经在指定的任务等中激活
当用户选择应用图标时,Activity
会被startActivity()
调用,其中包含以下数据:
Intent
的类名称,其中ACTION = MAIN和CATEGORY = LAUNCHER Activity
和FLAG_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执行任何操作,我们必须首先完成其他活动中的工作。
Android Lollipop上的行为
如果活动来自同一个应用程序,它将像在Lollipop之前一样工作,堆叠在任务之上。 但是如果从其他应用程序发送Intent。将创建新任务,新创建的Activity将作为根活动放置,如下所示。
来自here
的来源