【问题标题】:Why does Android launch multiple instances on singleTask or singleInstance?为什么 Android 会在 singleTask 或 singleInstance 上启动多个实例?
【发布时间】:2015-02-22 14:31:26
【问题描述】:

我想要达到的目标:

应该重用MainActivity,换句话说,我不想再次运行onCreate(),而只想在同一个Activity上运行onResume(),但我有一个奇怪的行为。 似乎 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 将在按下 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


【解决方案1】:

我能够隔离问题。多个实例是由于包含我的 AdMob 实现的片段而发生的。这不是“Android”问题。片段以某种方式泄漏。上面的代码似乎是正确的。

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2021-02-18
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    相关资源
    最近更新 更多