gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:49:52 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com