请有人给我一个示例,说明我们如何通过在堆栈顶部具有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
当launchMode
Android 需要决定如何Activity
启动.
taskAffinity
,如果没有特别设置,默认为应用程序的包名。具有相同的所有活动taskAffinity
都将启动到同一个任务中。
这让大多数开发人员感到困惑,因为文档中没有taskAffinity
经常提及。
如果您真的想确保 anActivity
始终是其任务的根,无论它如何启动,您都需要使用launchMode="singleTask"
orlaunchMode="singleInstance"
并指定taskAffinity=""
指示 theActivity
没有任务关联(即:它不属于任何其他活动)。
Application1
包含四个活动的应用程序:
Activity1
exported="false"
(也就是说,它true
是显式的或隐式的)Activity2
ActivityX
ActivityY
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
,这将启动Activity1
Activity1
, 开始Activity2
完成自己Activity2
, 开始ActivityX
完成自己ActivityX
,开始ActivityY
Application2
,这将启动AnotherActivity
AnotherActivity
,开始Activity1
Activity1
, 开始Activity2
而不结束本身Activity2
, 开始ActivityY
而不结束本身你去吧。现在使用后退按钮弹出堆栈。