请有人给我一个示例,说明我们如何通过在堆栈顶部具有launchMode = singleTask的Activity来创建任务回栈,并且它不是回栈中的唯一活动。
例如,我们在下图中有一个这样的任务(包括活动 X 和 Y);
据我所知, singleTask 活动应该是根活动,并且任务元素永远不能重新排列。
提前致谢
请有人给我一个示例,说明我们如何通过在堆栈顶部具有launchMode = singleTask的Activity来创建任务回栈,并且它不是回栈中的唯一活动。
例如,我们在下图中有一个这样的任务(包括活动 X 和 Y);
据我所知, singleTask 活动应该是根活动,并且任务元素永远不能重新排列。
提前致谢
实际上,这很容易做到。
要生成包含X在根和Y顶部的任务,即使Y声明为launchMode="singleTask":
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name=".X">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".Y" android:launchMode="singleTask"/>
</application>
在活动中X只需启动Y这样的活动:
startActivity(new Intent(this, SingleTaskActivity.class));
您现在将有一个任务,X其根为活动,并在其Y之上进行活动。
即使您明确表示要Y在新任务中启动,也会发生这种情况,如下所示:
Intent intent = new Intent(this, SingleTaskActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
这似乎违反直觉,但原因是两者X和Y具有相同的taskAffinity。taskAffinity当launchModeAndroid 需要决定如何Activity启动.
taskAffinity,如果没有特别设置,默认为应用程序的包名。具有相同的所有活动taskAffinity都将启动到同一个任务中。
这让大多数开发人员感到困惑,因为文档中没有taskAffinity经常提及。
如果您真的想确保 anActivity始终是其任务的根,无论它如何启动,您都需要使用launchMode="singleTask"orlaunchMode="singleInstance" 并指定taskAffinity=""指示 theActivity没有任务关联(即:它不属于任何其他活动)。
Application1包含四个活动的应用程序:
Activity1
exported="false"(也就是说,它true是显式的或隐式的)Activity2ActivityXActivityY
launchMode="singleTask"Activity1实现两个动作时,例如两个不同的按钮,每个按钮执行以下操作:
Activity2和结束自己Activity2和不结束自己Activity2实施两个动作:
ActivityX和结束自己ActivityY和不结束自己ActivityX实施一项行动:
ActivityY和不结束自己ActivityY没做什么 :)Application2使用 Activity
创建另一个应用程序:AnotherActivity
AnotherActivity实施一项行动:
Activity1。你可以这样做: Intent intent = new Intent();
// package, fully qualified class name
intent.setComponent(new ComponentName(
"com.stackoverflow", "com.stackoverflow.Activity1");
startActivity(intent);
Application1,这将启动Activity1Activity1, 开始Activity2完成自己Activity2, 开始ActivityX完成自己ActivityX,开始ActivityYApplication2,这将启动AnotherActivityAnotherActivity,开始Activity1Activity1, 开始Activity2 而不结束本身Activity2, 开始ActivityY 而不结束本身你去吧。现在使用后退按钮弹出堆栈。