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

Android 通过方向更改保持对象,但在应用程序停止时释放资源,android,screen-orientation,Android,Screen Orientation,当设备旋转时,活动将完全销毁并重新创建,以满足可能的新资源需求。不幸的是,这意味着我使用的SoundPool会被破坏,应用程序必须重新加载每个声音 在我的系统中,我已经实现了一个,你可以 我的问题是,现在即使应用程序停止,声音池仍保持加载状态。在这个应用程序的情况下,它可能不是必要的,但我想在这种情况下免费的资源 当运行时配置发生更改时,是否有办法使像SoundPool这样的对象仅加载并在应用程序停止时释放其资源 [注意:为了更好地反映问题,我已经完全重写了问题。]我认为您可以使用服务,将声音

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

在我的系统中,我已经实现了一个,你可以

我的问题是,现在即使应用程序停止,声音池仍保持加载状态。在这个应用程序的情况下,它可能不是必要的,但我想在这种情况下免费的资源

当运行时配置发生更改时,是否有办法使像
SoundPool
这样的对象仅加载并在应用程序停止时释放其资源



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

我认为您可以使用服务,将声音池对象移动到服务,并在活动中在onCreate中绑定到服务,在onDestroy中解除绑定。如果活动绑定到服务,您可以使用活页夹将命令传输到它。

声音池不可打包(或序列化),因此您无法(轻松)将其打包

最简单的方法是为应用程序创建应用程序的子类,使声音池成为自定义应用程序类的实例变量,并使用getApplicationContext的强制转换从活动中公开管理声音池的方法(应用程序类本质上是一个在应用程序存在期间“存在”的单例)

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

因为,这种方法在与一起使用时有效

由于它仅在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();
    }
}

请随意。

可以播放活动服务中的声音池中的声音吗?@J0hj0h,可以,服务的实现必须返回非空绑定器,这将使您能够与服务交互,这样您可以在触摸时做出正确的反应。或者您可以使用本地广播与服务交互。我看到这种情况e service在onCreate中加载资源,并在onDestroy中释放它们。另外,静态声音池和列表也不是一个好主意。我只是再次查看了服务,它们似乎是为在后台独立于活动运行的任务而设计的。这里不是这样,我只想在方向为ch的情况下不重新加载所有声音愤怒。你能解释一下为什么
static
不好吗?@J0hj0h,“static”变量可能会导致内存泄漏和不必要的资源消耗,使用扩展应用程序或服务可以解决这一问题。作为专为后台任务设计的预期服务,良好的播放声音似乎对我来说已经足够了。在你的如果您只需要播放小文件服务,可能会增加开销,但如果您不使用该服务,也不想使用一些不好的解决方案,那么您应该自己控制活动的配置更改,这将阻止它重新创建。我很想听听那些更优雅的解决方案。;)在片段方法中,为什么不在
ondestory
回调上检查
getActivity().isChangingConfigurations()