可以请有人给我一个例子,说明我们如何创建一个任务后台堆栈,在堆栈顶部有一个具有launchMode = singleTask的Activity,它不是后台堆栈中的唯一活动 .
例如,我们在下图中有一个这样的任务(包括活动X和Y);
据我所知,singleTask活动应该是根目录,任务元素永远不能重新排列 .
提前致谢
创建一个包含四个活动的应用 Application1 :
Application1
Activity1
确保它 is not exported="false" (也就是说,它是 true 显式或隐式)
exported="false"
true
将其作为 Launcher
Activity2
ActivityX
ActivityY
这是一个: launchMode="singleTask"
launchMode="singleTask"
在 Activity1 实施两项行动,例如两个不同的按钮各执行以下操作:
开始 Activity2 并完成自己
开始 Activity2 和 do not 完成自己
在 Activity2 实施两项行动:
开始 ActivityX 并完成自己
开始 ActivityY 和 do not 完成自己
在 ActivityX 实施一个动作:
ActivityY 什么都不做:)
使用活动创建另一个应用 Application2 :
Application2
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 without 完成自身
在 Activity2 中,启动 ActivityY without 完成自身
你去吧现在用后退按钮弹出堆栈 .
实际上,这很容易做到 .
要生成在根目录中包含 X 且在顶部包含 Y 的任务,即使使用 launchMode="singleTask" 声明了 Y :
X
Y
<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 . 当Android需要决定如何启动 Activity 时, taskAffinity 胜过 launchMode .
taskAffinity
Activity
launchMode
taskAffinity ,如果没有特别设置,则默认为应用程序的包名称 . 具有相同 taskAffinity 的所有活动将启动到同一任务中 .
这使大多数开发人员感到困惑,因为文档没有经常提及 taskAffinity .
如果你真的想确定 Activity 永远是它的任务的根,无论它是如何启动的,你需要使用 launchMode="singleTask" 或 launchMode="singleInstance" and 指定 taskAffinity="" 来表示 Activity 没有任务亲和力(即:它不属于任何其他活动) .
launchMode="singleInstance"
taskAffinity=""
2 回答
创建一个包含四个活动的应用
Application1
:Activity1
确保它 is not
exported="false"
(也就是说,它是true
显式或隐式)将其作为 Launcher
Activity2
ActivityX
ActivityY
这是一个:
launchMode="singleTask"
在
Activity1
实施两项行动,例如两个不同的按钮各执行以下操作:开始
Activity2
并完成自己开始
Activity2
和 do not 完成自己在
Activity2
实施两项行动:开始
ActivityX
并完成自己开始
ActivityY
和 do not 完成自己在
ActivityX
实施一个动作:开始
ActivityY
和 do not 完成自己ActivityY
什么都不做:)使用活动创建另一个应用
Application2
:AnotherActivity
将其作为 Launcher
在
AnotherActivity
实施一个动作:开始
Activity1
. 你可以这样做:启动
Application1
,将启动Activity1
在
Activity1
中,启动Activity2
完成自身在
Activity2
中,启动ActivityX
完成自身在
ActivityX
中,启动ActivityY
按回家
启动
Application2
,将启动AnotherActivity
在
AnotherActivity
中,启动Activity1
在
Activity1
中,启动Activity2
without 完成自身在
Activity2
中,启动ActivityY
without 完成自身你去吧现在用后退按钮弹出堆栈 .
实际上,这很容易做到 .
要生成在根目录中包含
X
且在顶部包含Y
的任务,即使使用launchMode="singleTask"
声明了Y
:在活动
X
中,只需启动活动Y
,如下所示:现在,您将拥有一个任务,其根目录为活动
X
,活动为Y
.即使您明确表示要在新任务中启动
Y
,也会发生这种情况,如下所示:这似乎违反直觉,但原因是因为
X
和Y
具有相同的taskAffinity
. 当Android需要决定如何启动Activity
时,taskAffinity
胜过launchMode
.taskAffinity
,如果没有特别设置,则默认为应用程序的包名称 . 具有相同taskAffinity
的所有活动将启动到同一任务中 .这使大多数开发人员感到困惑,因为文档没有经常提及
taskAffinity
.如果你真的想确定
Activity
永远是它的任务的根,无论它是如何启动的,你需要使用launchMode="singleTask"
或launchMode="singleInstance"
and 指定taskAffinity=""
来表示Activity
没有任务亲和力(即:它不属于任何其他活动) .