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