在查看我需要维护/修改的代码以及不同的文档和解释之后,我真的对单个任务和任务亲和力感到困惑。
https://developer.android.com/guide/topics/manifest/activity-element.html https://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack https://developer.android.com/guide/components/activities/tasks-and-back-stack.html
我理解的是活动启动模式singleTask将创建一个新任务并将该活动放在任务的根目录下。仅当活动具有ACTION_MAIN和CATEGORY_LAUNCHER过滤器时,才应使用“singleTask”和“singleInstance”
活动taskAffinity是活动具有亲和力的任务。默认情况下,所有活动共享相同的关联,即默认包名称。如果希望活动具有不同的亲和力任务,则定义另一个名称并使用FLAG_NEW_ACTIVITY_TASK启动。
在我的维护代码(不是原始开发人员)中,AndroidManifest.xml中有很多活动,包含launchMode singleTask。
<activity name="LauncherActivity"
launchMode="singleTask">
<intent-filter>
<action name="action.MAIN" />
<category name="category.LAUNCHER />
</intent-filter>
</activity>
<activity name="TabsActivity"
launchMode="singleTask">
</activity>
<activity name="SubTab1"
launchMode="singleTask">
</activity>
<activity name="SubTab2"
launchMode="singleTask">
</activity>
<activity name="SubTab3"
launchMode="singleTask">
</activity>
<activity name="SubTab4"
launchMode="singleTask">
</activity>
<activity name="ScreenActivity"
launchMode="singleTask"
taskAffinity="com.xxx.xxx.sa"
excludeFromRecents="true">
</activity>
SubTab可以启动其他标准的launchMode,它将在使用后退键后销毁。
EveryTime用户点击App图标,它将转到TabsActivity而不是用户交互的最后一个活动。所以我在LauncherActivity onCreate()
中添加了一些代码if (!isTaskRoot() && !TextUtils.isEmpty(action)) {
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) &&
Intent.ACTION_MAIN.equals(action)) {
finish();
return;
}
}
这成功地引导了用户交互的最后一个活动。
第一个问题来自于isTaskRoot()。根据解释: boolean isTaskRoot() 返回此活动是否是任务的根。根是任务中的第一个活动。
如上所述,LauncherActivity定义为singleTask,因此它应该是任务中的根。但是当onCreate()检查时,当启动其他活动(包括SingleTask活动)时,它不是根任务。启动TabsActivity时,单击AppIcon时,LauncherActivity onCreate()isTaskRoot()将返回false。 LauncherActivity和TabsActivity,它们应该在不同的任务和每个任务中,每个都是根活动。 在其他一些注释中,它提到当活动堆栈中没有活动时isTaskRoot()为true。因此,如果堆栈中有活动,if将返回false。那么它与堆栈而不是任务更相关?我真的很困惑。有人可以解释为什么它与文档说明不同。
第二个修改是删除了ScreenActivity taskAffinity。在旧设计中,可以通过单击通知来支持ScreenActivity。但是有新的要求,如果用户最后一次启动ScreenActivity,当点击App图标时,它应该返回到该活动。在AndroidManifest中删除了taskAffinity后,它确实发生了我想要的。 我正在寻找这个幻灯片分享教程。但仍然没有得到。 https://www.slideshare.net/rajdeep/managing-activity-backstack
我的问题是,如果singleTask没有taskAffinity,他们如何为每个不同的singleTask活动创建一个新任务。背板如何工作?
修改后,LauncherActivity,TabsActivity,ScreenActivity是SingleTask,具有相同的默认包名称任务。所以他们在同一个任务堆叠?如果是,则与文档说明不同。请帮助我更清楚地了解这一点。
非常感谢。