为什么 Android 在 singleTask 或 singleInstance 上启动多个实例?

Why does Android launch multiple instances on singleTask or singleInstance?

我想达到的目标:

MainActivity 应该重用,换句话说,我不想运行 onCreate() 重来一遍,而是只onResume() 上同一个Activity,但我有一个奇怪的行为。 AndroidManifest 中的 launchMode 似乎被忽略了。无论我设置什么(singleTasksingleInstance),它总是会创建一个新的 Activity,这会导致堆不断增长。当我使用主页按钮退出应用程序并再次启动它时,每次都会创建一个新实例。 (在 .hprof 泄漏报告中观察到)。

这是它的样子:

<activity
    android:name="com.mydomain.myapp.pro.MainActivity"
    android:launchMode="singleTask"
    android:screenOrientation="nosensor" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

当我试图隔离问题时,我看到 Activity 将在按下主页时被杀死(onDestroy() 被执行),但泄漏报告显示了这一点。每次我启动应用程序时,我都会得到越来越多的 MainActivity 实例,尽管最后一个实例被认为已被销毁。怎么可能onDestroy()被执行了,但是我启动Activity(直接通过应用程序启动)的实例有多少:

同样有趣的是 onDestroy() 完全被执行了,因为我从来没有调用过 finish() 而且我还有很多资源。所以没必要Android干掉Activity,但是上面的问题一开始比较重要。可能是因为我在 onPause() 上的 MainActivity 中 finish() 杀死了所有片段。否则碎片会泄漏。片段的 onDestroy() 调用 super.onDestroy() 可能是 MainActivity.

我能够找出问题所在。多个实例的发生是由于包含我的 AdMob 实现的片段。这不是 "Android" 问题。该片段不知何故泄漏。上面的代码似乎是正确的。