可以请某人给我一个例子,告诉我如何在堆栈顶部创建一个具有launchMode = singleTask的Activity,并且它不是后端堆栈中唯一的活动,从而创建一个任务堆栈。
例如,我们在下图中有一个这样的任务(包括活动X和Y的那个);
据我所知,singleTask活动应该是根目录,任务元素永远不能重新排列。
提前致谢
答案 0 :(得分:0)
Application1
:
Activity1
exported="false"
(即显式或隐式显示true
)Activity2
ActivityX
ActivityY
launchMode="singleTask"
Activity1
中执行两项操作,例如两个不同的按钮各执行以下操作:
Activity2
并自行完成Activity2
, 完成Activity2
中执行两项操作:
ActivityX
并自行完成ActivityY
, 完成ActivityX
中实施一项操作:
ActivityY
, 完成ActivityY
什么都不做:)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
,不自行完成Activity2
中,启动ActivityY
,不自行完成你去吧。现在用后退按钮弹出堆栈。
答案 1 :(得分:0)
实际上,这很容易做到。
要生成在根位置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
。当Android需要决定如何启动launchMode
时,Activity
胜过taskAffinity
。
taskAffinity
,如果没有特别设置,则默认为应用程序的包名称。具有相同taskAffinity
的所有活动将启动到同一任务中。
这会让大多数开发人员感到困惑,因为文档并没有经常提及Activity
。
如果您确实希望确保launchMode="singleTask"
永远是其任务的根,无论它是如何启动的,您都需要使用launchMode="singleInstance"
或taskAffinity=""
< strong>和指定Activity
表示genres
没有任务关联(即:它不属于任何其他活动)。