【发布时间】:2015-02-22 14:31:26
【问题描述】:
我想要达到的目标:
应该重用MainActivity,换句话说,我不想再次运行onCreate(),而只想在同一个Activity上运行onResume(),但我有一个奇怪的行为。
似乎 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 将在按下 home 时被杀死(onDestroy() 被执行),但泄漏报告显示了这一点。每次我启动应用程序时,我都会得到越来越多的 MainActivity 实例,尽管最后一个实例被认为是被销毁的。怎么可能是onDestroy()被执行了,但是实例数和我启动Activity一样多(直接通过app start):
onDestroy() 被执行也很有趣,因为我从不调用finish(),而且我还有很多资源。所以Android没有必要杀掉Activity,但是上层问题一开始更重要。也许是因为我在 onPause() 上的 MainActivity 中通过 finish() 杀死了所有片段。否则碎片会泄漏。而片段的onDestroy() 调用super.onDestroy() 这可能是MainActivity。
【问题讨论】:
-
看起来不错应该是您的活动代码中的问题..
-
这很奇怪,因为报告的唯一泄漏是 Activity 本身。
-
@Bevor Google 不推荐您的方法 OOTB。你想达到什么目的?该框架将处理内存问题...
-
@AaronMcIver 问题是预期的行为似乎都不起作用:在我看来,默认用例是用户将 Activity 置于后台(按下 Home,onPause())和恢复它(onResume())。除非 Android 决定这样做,否则 Activity 不会被杀死。这就是我想要实现的默认行为。但即使是默认行为似乎也不起作用。每次我带回活动时,都会执行 onCreate() ,甚至在新实例上也是如此。这对我来说似乎是完全错误的,尤其是当我设置
singleInstance。
标签: android android-activity launchmode