为什么 Android 在 singleTask 或 singleInstance 上启动多个实例?
Why does Android launch multiple instances on singleTask or singleInstance?
我想达到的目标:
MainActivity 应该重用,换句话说,我不想运行 onCreate()
重来一遍,而是只onResume()
上同一个Activity,但我有一个奇怪的行为。
AndroidManifest 中的 launchMode
似乎被忽略了。无论我设置什么(singleTask
、singleInstance
),它总是会创建一个新的 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" 问题。该片段不知何故泄漏。上面的代码似乎是正确的。
我想达到的目标:
MainActivity 应该重用,换句话说,我不想运行 onCreate()
重来一遍,而是只onResume()
上同一个Activity,但我有一个奇怪的行为。
AndroidManifest 中的 launchMode
似乎被忽略了。无论我设置什么(singleTask
、singleInstance
),它总是会创建一个新的 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" 问题。该片段不知何故泄漏。上面的代码似乎是正确的。