我有两个活动: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。然后我按下Home按钮并返回到手机的主屏幕。接着,我打开浏览器应用,并输入以下内容:
dd://b
打开B活动。系统导航到我的应用程序并在A活动之上启动B活动。此时,如果我按返回按钮,B活动就会被弹出,我就能看到A活动。
这不是我所期望的,因为Android文档说明:
对于singleTask活动,系统会创建一个新任务并在新任务的根部实例化活动。但是,如果该活动的实例已经存在于另一个任务中,则系统通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新的实例。每次只能存在一个活动实例。
从这些句子中我理解到,在我的情况下,由于不存在B活动的实例,应该启动一个新任务,并且它的堆栈中应该只有B活动(我的应用程序的另一个实例仍然存在于单独的任务中,并且应该具有A活动在它的堆栈中)。然后,如果我在B活动中按返回键,由于它是后退堆栈中唯一的活动,它就会被弹出,系统就会返回浏览器。
为什么情况不是这样?Android系统如何知道我的应用程序已经打开并导航到它并在现有应用程序堆栈的顶部启动B活动,而不是启动我的应用程序的另一个实例并让这两个应用程序实例拥有自己的堆栈?在新任务中实例化活动是什么意思?有人能解释一下吗?
谢谢。