Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
启动程序活动的Android默认启动模式?_Android_Android Activity - Fatal编程技术网

启动程序活动的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文档,flag
flag\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也不会每隔一段时间创建一个新实例