将主 Activity 标记为
singleTask
时,从启动器启动时会销毁其他 Activity。但是,当从“最近”启动时,它只会恢复最近打开的活动。为什么会这样呢?我该如何预防呢?
为了说明这一点,(活动 A 标记为
singleTask
),行为如下:
活动 A -> 活动 B -> 从启动器打开应用程序 -> 活动 A
活动 A -> 活动 B -> 从最近打开应用程序 -> 活动 A -> 活动 B
从启动器打开时,我希望有相同的堆栈(A -> B)。
我读了很多 StackOverflow 和 Reddit 帖子,但似乎没有一个完全适用于我的情况和/或正确解释为什么会发生这种情况以及如何解决它。
例如,这篇文章似乎描述了我的确切问题。但是我不知道提到的解决方案应该如何工作。因为在我的复制品中
onCreate
从未被调用过。此外,Activity B 被破坏。因此,即使我能够在 Activity A 的 finish
方法中调用 onCreate
,我最终也会完成整个应用程序,而不是仅完成 Activity A 的该实例
GitHub 上的复制:https://github.com/tafelnl/android-single-task-launch-reproduction这只是一个具有两个活动的简单应用程序。
MainActivity
被标记为 singleTask
并通过意图启动 SecondActivity
。您可以观察到该行为如上所述。
尽量不要在 MainActivity(ACTION_MAIN 和 CATEGORY_LAUNCHER)上使用 singleTask launchMode,以防当用户点击启动器将您的应用程序带到前台时,同一任务关联中的其他 Activity(例如 SecondActivity)被 Android 销毁。
或者,安全地,您可以创建一个启动 Activity 作为条目,而无需任何 UI,无论后续 Activity 上设置了其他不同的启动模式:
<!-- AndroidManifest -->
<activity
android:name=".SplashActivity"
android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
</activity>
// SplashActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
startActivity(Intent(this, MainActivity::class.java))
finish()
}