通过方向更改保留对象,但在应用程序停止时释放资源
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();
}
}
旋转设备时,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')。
(可能还有更优雅的解决方案)
如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();
}
}