通过方向更改保留对象,但在应用程序停止时释放资源

Keep object through orientation change but free resources when app is stopped

旋转设备时,activity 将被完全销毁并重新创建以满足可能的新资源需求。不幸的是,这意味着我使用的 SoundPool 被破坏,应用程序必须重新加载每个声音。

在我的 code on GitHub I have implemented a retained fragment, you can check out the branch.

我的问题是,现在即使应用程序停止,SoundPool 仍保持加载状态。对于这个应用程序,它可能不是必需的,但我想在这种情况下释放资源。

有没有办法在运行时配置发生更改时 加载 SoundPool 这样的对象,并 释放 它的应用程序停止时的资源?


[注意:我已经完全重写了问题以更好地反映问题。]

我认为您可以使用 Service,将您的 SoundPool 对象移动到 Service,然后 activity 在 onCreate 中绑定到服务,在 onDestroy 中解除绑定。如果 activity 绑定到服务,您可以使用活页夹将命令传输给它。

SoundPool 不是 Parcelable(或 Serializable),因此您不能(轻松地)将其放入 Bundle。

做你想做的最简单的方法是为你的应用程序创建一个应用程序的子class,使 SoundPool 成为你的自定义应用程序的一个实例变量class并公开方法来管理来自您的 Activity 使用 getApplicationContext 转换的 SoundPool(应用程序 class 本质上是一个单例,在应用程序存在期间 'lives')。

(可能还有更优雅的解决方案)

, the retained fragment approach works when used with Activity.isChangingConfigurations.

由于它只在 API 级别 11 中引入,在旧设备上我没有释放资源:

@Override
public void onStop() {
    super.onStop();

    // Free resources when not restarting, if API level is appropriate.
    if (Build.VERSION.SDK_INT >= 11 && !getActivity().isChangingConfigurations()) {
        freeResources();
    }
}

随时check out the commit on GitHub