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

时间:2015-08-27 15:15:32

标签: android screen-orientation

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

在我的code on GitHub我实施了retained fragment,您可以check out the branch

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

当运行时配置发生变化时,有没有办法让SoundPool加载 ?当应用停止时,免费其资源?< / p>

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

3 个答案:

答案 0 :(得分:0)

我认为您可以使用Service,将SoundPool对象移动到Service,并将活动绑定到onCreate中的服务,并在onDestroy中取消绑定。如果活动绑定到服务,您可以使用binder将命令传输给它。

答案 1 :(得分:0)

SoundPool不可分配(或可序列化),因此您无法(轻松)将其放入捆绑包中。

执行所需操作的最简单方法是为应用程序创建Application的子类,使SoundPool成为自定义Application类的实例变量,并使用getApplicationContext的强制转换公开方法以从Activity管理SoundPool(应用程序类本质上是一个在应用程序存在期间存在的单身人士。

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

答案 2 :(得分:0)

作为tato.rodrigo pointed out,与retained fragment一起使用时Activity.isChangingConfigurations方法有效。

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

An exception occurred while executing 
'INSERT INTO UserAbstractContent(read,accept,content_id,user_id) VALUES (?,?,?,?)' 
with paramas[null,null,60,3] sql state 42000  syntax error or access violation.

随意check out the commit on GitHub