Manifest 中定义的启动模式是否会覆盖通过 Intent 标志调用的启动模式,还是相反?

San*_*alp 5 android android-manifest android-intent

案例一:- 当意图标志覆盖清单时

在清单文件中,我将 Activity_B 定义为 singleTop。这些是清单文件中的相关行:-

....
<activity android:name=".Activity_A" android:launchMode="standard">
...
<activity android:name=".Activity_B" android:launchMode="singleTop"/>
<activity android:name=".Activity_C" android:launchMode="standard"/>
<activity android:name=".Activity_D" android:launchMode="standard"/>
....
Run Code Online (Sandbox Code Playgroud)

完整的清单文件如下:-

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".Activity_A" android:launchMode="standard">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Activity_B" android:launchMode="singleTop"/>
    <activity android:name=".Activity_C" android:launchMode="standard"/>
    <activity android:name=".Activity_D" android:launchMode="standard"/>
</application>
Run Code Online (Sandbox Code Playgroud)

现在创建了一个方法,该方法在运行时将 Activity_B 设置为 singleTask,该方法如下所示:-

protected void startActivity(Activity activity, Class targetActivityClass){
    Intent intent=new Intent(activity,targetActivityClass);
    if(targetActivityClass.equals(Activity_B.class)) {
        getIntent().setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TOP);
    }
    startActivity(intent);

}
Run Code Online (Sandbox Code Playgroud)

现在,当我运行这个应用程序时,我注意到 Intent 标志覆盖了清单文件中的启动模式。

我是如何得出这个结论的:-基本上我注意到,当我启动多个活动后转到 Activity_B 时,活动数量减少,这是单任务启动模式的典型行为

案例 II:- 当清单覆盖意图标志时

为了确认这一点,我在清单文件中将 Activity B 的启动模式更改为 singleInstance,并在 IntentFlag 中将启动模式保留为 singleTask。 现在清单文件的启动模式设置为 singleInstance

<activity android:name=".Activity_B" android:launchMode="singleInstance"/>
Run Code Online (Sandbox Code Playgroud)

startActivity方法保持不变,

protected void startActivity(Activity activity, Class targetActivityClass){
Intent intent=new Intent(activity,targetActivityClass);
if(targetActivityClass.equals(Activity_B.class)) {
    getIntent().setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TOP);
}
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

}

然而,这一次,清单文件没有被覆盖。

我是如何得出这个结论的?活动 C 没有添加到包含活动 B 的任务中,这是 singleInstance 启动模式的典型行为。

我试图在文档中找到这一点,但那里没有提到这种行为。任何人都可以解释为什么这两种情况下的结果不同,发生了什么,清单中定义的启动模式是否覆盖通过意图标志调用的启动模式,或者是相反的方式,或者这些启动模式有一些内部优先顺序?

(这是我在 StackOverflow 上的第一个问题,对于我无意中犯下的任何错误,我深表歉意)

Sag*_*gar 1

任何人都可以解释究竟发生了什么,清单中定义的启动模式是否会覆盖通过意图标志调用的启动模式,还是相反?

在 Activity 启动期间通过 Intent 定义的标志会覆盖 Manifest 中的默认模式。

根据文档

启动活动时,您可以通过在传递给 startActivity() 的意图中包含标志来修改活动与其任务的默认关联。

以下是可用于修改默认行为的标志: