android - launchMode ="singleTask"不创建新任务

标签 android android-intent android-task

我有 2 个 Activity:Activity A 和 Activity B。Activity A 的启动模式是标准的,Activity B 的启动模式是 singleTask。

 <activity
    android:name=".AActivity"
    android:label="@string/app_name"
    android:launchMode="standard">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="dd"></data>
        <data android:host="a"></data>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
</activity>
<activity
    android:name=".BActivity"
    android:label="@string/app_name"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="dd"></data>
        <data android:host="b"></data>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
</activity>

我启动应用程序,启动器 Activity A 启动。然后我按主页按钮并返回手机的主屏幕。然后我启动浏览器应用程序并键入以下内容:

dd://b

打开 Activity B。系统导航到我的 App 并在 Activity A 之上启动 Activity B。此时,如果我按下后退按钮,Activity B 会弹出,我会看到 Activity A。

这不是我所期望的,因为 android 文档指出:

For singleTask activities, the system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to its onNewIntent() method, rather than creating a new instance. Only one instance of the activity can exist at a time.

我从这些句子中理解的是,在我的例子中,由于 Activity B 的实例不存在,一个新任务应该已经启动并且它的堆栈中应该只有 Activity B(我的应用程序的另一个实例应该仍然存在于一个单独的任务中,它的堆栈中应该有 Activity A)。然后,如果我在 Activity B 中按下返回键,因为它是后台堆栈中唯一的 Activity,它会弹出,系统返回到浏览器。

为什么不是这样? Android 系统如何知道我的应用程序已打开并导航到它并在现有应用程序堆栈之上启动 Activity B,而不是启动我的应用程序的另一个实例并让我的应用程序的两个实例拥有自己的堆栈? 在新任务中实例化 Activity 是什么意思?谁能解释一下?

谢谢。

最佳答案

除了已接受的答案外,我还找到了对此问题的解释。正如 android 文档所述:

The affinity indicates which task an activity prefers to belong to. By default, all the activities from the same application have an affinity for each other. So, by default, all activities in the same application prefer to be in the same task which belongs to that app(The app that has the Activity B). However, you can modify the default affinity for an activity.

因此,如果您的应用程序正在运行,并且您启动了一个具有 launchMode:singleTask 属性的 Activity ,除非您明确声明 taskAffinity 属性,否则它会在同样的任务。但是,如果您在 list 中明确声明亲和性:

<activity
        android:name=".BActivity"
        android:label="@string/app_name"
        android:taskAffinity=""
        android:launchMode="singleTask">
</activity>

然后它在新任务中启动 Activity 。

可以通过以下adb命令查看哪个activity属于哪个task:

adb shell dumpsys activity

此外,为了更好地理解 launchMode 概念,您可以在 Google Play 中查看以下应用:https://play.google.com/store/apps/details?id=com.novoda.demos.activitylaunchmode

关于android - launchMode ="singleTask"不创建新任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32824079/

相关文章:

android - 打开特定的文件扩展名

android - Lollipop : Get top activity name

android - 如果条件不满足,不要关闭 DialogPreference onClick

Android ExpandableListView onClickListener 放在哪里

android - 与 JSch 的简单 SSH 连接

android padding - 有时在 4.2.2 中被忽略,在 4.0.4 中有效

android - 在外部应用程序中启动 Activity 是否有区别(并且是否有首选方法)?

android - 在不破坏底部 Activity 的情况下返回一些 Activity

android - 单击通知时如何保留当前返回堆栈(或任务)?

android - 始终重新创建具有 launchMode singleTop 或 singleTask 的 Activity