launchMode =“singleTask”不会创建新任务

时间:2015-09-28 13:19:51

标签: android android-intent android-task

我有2个活动:活动A和活动B.活动A的启动模式是标准的,活动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>

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

dd://b

打开活动B.系统导航到我的应用程序并在活动A之上启动活动B.此时,如果我按回按钮,活动B将弹出,我看到活动A.

这不是我的预期,因为android文档声明:

  

对于singleTask活动,系统会创建一个新任务,并在新任务的根目录下实例化该活动。但是,如果活动的实例已存在于单独的任务中,则系统会通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新实例。一次只能存在一个活动实例。

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

为什么不是这样? android系统如何知道我的应用程序是打开并导航到它并在现有应用程序堆栈上启动活动B而不是启动我的应用程序的另一个实例并让我的应用程序的两个实例拥有自己的堆栈? 在新任务中实例化活动意味着什么?有人可以解释一下吗?

感谢。

2 个答案:

答案 0 :(得分:7)

除了接受的答案外,我还找到了解决这个问题的方法。正如android文档所述:

  

亲和力表示活动更喜欢属于哪个任务。默认情况下,同一应用程序中的所有活动都具有彼此的关联。因此,默认情况下,同一应用程序中的所有活动都希望属于属于该应用程序的同一任务(具有活动B的应用程序)。但是,您可以修改活动的默认关联。

因此,如果您的应用正在运行,并且您启动了具有launchMode:singleTask属性的活动,除非您明确声明 taskAffinity 属性,否则它会在同一任务中启动活动。但是,如果您在清单中明确说明了亲密关系:

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

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

您可以通过以下adb命令查看哪个活动属于哪个任务:

adb shell dumpsys activity

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

答案 1 :(得分:0)

你说你的应用程序在经过A时导航到B.

所以,我认为你有两个堆栈。在第一个中,你只有A,在第二个你只有B.如果你按回去,那么B会弹出并消失,但A存在并显示,因为A在B后面,即使A和B在单独的堆栈中。 / p>

如果你想要B弹出然后你回到家里,试着打电话给&#34;完成()&#34;从A

致电B之后