【发布时间】:2015-12-25 18:13:31
【问题描述】:
我有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
打开活动B。系统导航到我的应用程序并在活动A之上启动活动B。此时如果我按下返回按钮,活动B被弹出并且我看到活动A。
这不是我所期望的,因为 android 文档指出:
对于 singleTask 活动,系统会创建一个新任务并在新任务的根目录中实例化该活动。但是,如果活动的实例已经存在于单独的任务中,系统会通过调用其 onNewIntent() 方法将意图路由到现有实例,而不是创建新实例。一次只能存在一个活动实例。
我从这些句子中了解到的是,在我的情况下,由于 Activity B 的实例不存在,因此应该启动一个新任务,并且它的堆栈中应该只有 Activity B(我的应用程序的另一个实例应该仍然存在于一个单独的任务中,它的堆栈中应该有 Activity A)。然后如果我在 Activity B 时按下 back,因为它是 backstack 中唯一的 Activity,它会被弹出并系统返回到浏览器。
为什么不是这样? android系统如何知道我的应用程序已打开并导航到它并在现有应用程序堆栈之上启动活动B,而不是启动我的应用程序的另一个实例并让我的应用程序的两个实例拥有自己的堆栈? 在新任务中实例化 Activity 是什么意思?谁能解释一下?
谢谢。
【问题讨论】:
标签: android android-intent android-task