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

launchMode中的launcher activitylaunchMode是否会被忽略? android文档说默认的launchMode是“标准的”但是这对我来说不是逻辑,如果这将应用于应用程序的主要活动,因为每次启动应用程序时,将在该instance中创建另一个task应用程序。

Related of "Android默认启动LAONCHER活动的模式?"

好吧,我自己钻研了Android源代码,发现了以下内容。

启动程序使用LauncherAppsService startActivityAsUser方法启动应用程序。 意图使用以下行构建:

 Intent launchIntent = new Intent(Intent.ACTION_MAIN); launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); launchIntent.setComponent(component); launchIntent.setSourceBounds(sourceBounds); launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

根据Android文档,标志FLAG_ACTIVITY_NEW_TASK表示:

使用此标志时,如果任务已在您正在启动的活动中运行,则不会启动新活动; 相反,当前任务将简单地以其最后一个状态被带到屏幕的前面。

这有效且无条件地覆盖应用launchMode指定(或省略默认行为)的launchMode ,并忽略此属性。

我认为这表明文档不够清晰(或完整)。 如果不对核心源代码进行如此深入的调查,每个人都会偶尔获得意想不到的结果。

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

      

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

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

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

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

launchMode

每个Activity都有一个指定的launchMode (默认为"standard""multiple" 。这告诉Android如何启动此Activity ,有许多因素可以促成launchMode的“解释”。这取决于其他标志可能已在使用的Intent指定。它取决于请求启动Activity任务(或者如果从非活动上下文请求启动,例如从ServiceBroadcastReceiver请求)。这取决于是否存在Activity实例已在指定的任务中处于Activity状态等。

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

当用户选择应用程序图标时,将使用包含以下数据的Intent调用startActivity()

  • ACTION = MAIN
  • 类别= LAUNCHER
  • 组件设置为包名称和在清单中使用ACTION = MAIN和CATEGORY = LAUNCHER定义的Activity的类名称
  • 设置标志FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_RESET_TASK_IF_NEEDED

无论要启动的ActivitylaunchMode定义如何,使用launchModeIntent调用startActivity()会导致以下行为:

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

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

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

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

有关FLAG_ACTIVITY_RESET_TASK_IF_NEEDED和一般任务重新定位的详细说明,请参阅此答案 。

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

根据android文档

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

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

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

Android前Lollipop上的行为

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

在此处输入图像描述

Android Lollipop上的行为

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

在此处输入图像描述

来自这里