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 时,活动数量减少,这是单任务启动模式的典型行为)
为了确认这一点,我在清单文件中将 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 上的第一个问题,对于我无意中犯下的任何错误,我深表歉意)
任何人都可以解释究竟发生了什么,清单中定义的启动模式是否会覆盖通过意图标志调用的启动模式,还是相反?
在 Activity 启动期间通过 Intent 定义的标志会覆盖 Manifest 中的默认模式。
根据文档:
启动活动时,您可以通过在传递给 startActivity() 的意图中包含标志来修改活动与其任务的默认关联。
以下是可用于修改默认行为的标志:
| 归档时间: |
|
| 查看次数: |
1680 次 |
| 最近记录: |