1

我正在开发一个具有一些全局状态(包括几个SoundPools,需要一段时间才能加载)的 android 应用程序,我正在寻找管理它的最佳方法。到目前为止,我可以看到两个选项,但都不是完美的:

  1. 将状态存储在我的主目录中Activity- 这很好地挂钩到Activity生命周期(有机会清理),并且我可以使用屏幕旋转onRetainNonConfigurationInstancegetLastNonConfigurationInstance保留状态,但是当在活动之间导航时,此状态将完全丢失并且必须重新 -加载,这将是不可接受的慢

  2. 将状态存储在全局单例或Application子类中 - 这允许状态在活动之间的导航中持续存在,但由于 Application 没有onDestroy事件,因此没有机会释放SoundPools

关于更好的方法来做到这一点的任何建议?或者我不应该担心在应用程序停止/终止时释放 SoundPools 吗?

谢谢,克里斯

4

2 回答 2

2

两者不仅不完美,而且实际上是非常糟糕的架构。

单例模式普遍受到越来越多的批评,而对于 Android 来说,情况更糟,因为您无法保证您的 Application 对象会持续存在(系统会在资源不足时将其杀死,这不是错误,而是正确的行为) .

onRetainNonConfigurationInstance 自 API 级别 13 起已弃用,Android 团队本身将其描述为“肮脏的黑客”;那也不是你想要使用的。

您可以通过将其托管在独立于您的活动的服务中来解决您的 Soundpool 持久性问题。一旦不再需要播放任何内容,请确保终止该服务。

于 2013-04-19T12:08:05.553 回答
0

好的,这不是一个完整的答案,但我会跟进一个更具体的问题。

但原则上,拥有一个本地Service确实可以按以下方式工作:

  • 有一个本地“绑定”服务持有状态
  • 有各种活动,每次绑定和解除绑定到服务,例如:

@Override
public void onStart() {
    super.onStart();
    Intent intent = new Intent(this, LocalStateService.class);
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}

@Override
public void onStop() {
    if (stateService != null) {
        unbindService(serviceConnection);
        stateService = null;
    }
}

由于活动生命周期故意重叠,服务将一直存在,直到用户退出应用程序(或干脆离开它并去做其他事情)。此时,onUnbindonDestroy调用该服务。

太好了,我们快到了。但是,该服务无法在配置重新启动(例如屏幕旋转)后继续存在,所以我将把它作为一个单独的问题发布......

于 2013-04-23T12:18:14.957 回答