启动程序活动的Android默认启动模式?
启动程序活动的Android默认启动模式?,android,android-activity,Android,Android Activity,清单中的启动程序活动的启动模式是否被忽略? android文档说默认的launchMode是“标准”的,但如果将其应用于应用程序的主要活动,这对我来说不是逻辑,因为每次启动应用程序时,都会在应用程序的实例中创建另一个任务,我自己深入研究了Android源代码,发现了以下内容 启动器使用LauncherAppsService中的startActivityAsUser方法启动应用程序。意图是使用以下线条构建的: Intent launchIntent = new Intent(Intent.ACTI
清单
中的启动程序活动
的启动模式
是否被忽略?
android
文档说默认的launchMode
是“标准”的,但如果将其应用于应用程序的主要活动,这对我来说不是逻辑,因为每次启动应用程序时,都会在应用程序的实例中创建另一个任务,我自己深入研究了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文档,flagflag\u ACTIVITY\u NEW\u TASK
表示:
使用此标志时,如果您正在启动的活动的任务已在运行,则不会启动新活动;取而代之的是,当前任务将简单地显示在屏幕的前面,并显示它最后的状态
这将有效且无条件地覆盖应用程序中指定的launchMode
(或忽略默认行为),并忽略此属性
我认为这表明文档不够清晰(或完整)。如果没有对核心源代码的深入研究,每个人都会不时得到意想不到的结果。把除了开放活动以外的一切都看作是一个抽象的实现。将活动声明为
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
如果将标志作为命令,则本应写入清单。您是对的。默认模式为“标准”
根据android文档
*在standard
模式下,每当有一个“标准”活动的新意图时,就会创建一个类的新实例来响应该意图。每个实例处理一个单一的意图
*。如果父活动具有启动模式标准
(并且启动意图不包含标志\u活动\u清除\u顶部
),则当前活动及其父活动都会从堆栈中弹出,并创建父活动的新实例以接收导航意图
活动行为设置为标准模式时,将始终创建一个新活动,以便在发送每个意图时单独工作。想象一下,如果有10个意图被发送来撰写一封电子邮件,那么应该有10个活动分别为每个意图服务。因此,在一台设备中启动的此类活动的数量可能是无限的
Android pre棒棒糖上的行为
标准活动将被创建并放置在堆栈顶部,与发送意图的任务位于同一任务中。
例如,当我们将图像从gallery共享到标准活动时,尽管它们来自不同的应用程序,但它们将被堆叠在与所述相同的任务中。
如果我们将应用程序切换到另一个应用程序,然后切换回Gallery,我们仍然会看到标准启动模式位于Gallery任务的顶部。因此,如果我们需要对Gallery做任何事情,我们必须首先完成额外活动中的工作
Android棒棒糖上的行为
如果这些活动来自同一个应用程序,它将像在棒棒糖前一样工作,堆叠在任务顶部。
但如果意图是从不同的应用程序发送的。将创建新任务,新创建的活动将作为根活动放置,如下所示
来源于你混淆了两件事。一个是launchMode
,另一个是“当用户从主屏幕选择应用程序图标或从最近的任务列表中选择任务时会发生什么”。这是两件完全不同的事情
launchMode
每个活动
都有一个指定的启动模式
(默认为“标准”
或“多个”
。这会告诉Android如何启动此活动
,并且有许多因素会影响“解释”它取决于所使用的意图中可能指定了哪些其他标志。它取决于哪个任务请求启动活动(或者如果启动是从非活动上下文请求的,例如从服务或广播接收器)。这取决于活动
的现有实例是否已在指定任务中处于活动状态,等等
从主屏幕或已安装应用程序列表中选择应用程序图标的行为
当用户选择应用程序图标时,将使用包含以下数据的意图调用startActivity()
:
- 动作=主要动作
- 类别=发射器
- 组件被设置为
活动的包名和类名,该活动在清单中定义为ACTION=MAIN和CATEGORY=LAUNCHER
- 设置了标记
标记活动\u新任务
和标记活动\u重置任务(如果需要)
无论要启动的活动的launchMode
定义如何,以意图调用startActivity()
都会导致以下行为:
如果已经有一个任务关联性与正在启动的活动
匹配的现有任务(简单地说,如果应用程序已经运行),Android只会将现有任务带到前台。就是这样。它不会创建任何活动
的实例。它不会调用onNewIntent()
在任何活动上
。它只会将现有任务带到前台。这就是为什么,即使您为启动器活动
指定launchMode=“standard”
,Android也不会每隔一段时间创建一个新实例