关于单个任务和任务关联的Android管理任务

时间:2017-04-26 04:24:28

标签: android android-activity

在查看我需要维护/修改的代码以及不同的文档和解释之后,我真的对单个任务和任务亲和力感到困惑。

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>
  • 点击用户图标时,
    1. 它将启动LauncherActivity。 LauncherActivity执行一些检查和启动TabsActivity并完成的任务 本身(LauncherActivity)。
    2. TabsActivity添加标签(SubTab1,SubTab2,SubTab3,SubTab4)。
    3. ScreenActivity将启动startActivity FLAG_ACTIVITY_NEW_TASK。
    4. ScreenActivity还会设置一个通知图标,以便用户可以直接返回此活动。

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,具有相同的默认包名称任务。所以他们在同一个任务堆叠?如果是,则与文档说明不同。请帮助我更清楚地了解这一点。

非常感谢。

0 个答案:

没有答案