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

时间:2018-06-28 05:59:11

标签: android android-intent android-manifest

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

在清单文件中,我将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"/>
....

完整清单文件如下:-

<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>

现在创建了一个方法,该方法在运行时将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);

}

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

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

案例II:-清单超过意图标志时

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

<activity android:name=".Activity_B" android:launchMode="singleInstance"/>

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);

}

但是,这次清单文件没有被覆盖。

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

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

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

1 个答案:

答案 0 :(得分:0)

  

任何人都可以确切解释发生的情况是否是启动模式   在清单中定义的方法会覆盖通过意图标志调用的启动模式   还是相反?

在活动开始期间通过Intent定义的标记会覆盖清单中的默认模式。

基于documentation

  

开始活动时,可以修改以下项的默认关联   通过在您的意图中包含标志来完成其任务的活动   交付给startActivity()。

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