Java 在服务中保存持久数据的最佳时间(不总是调用Service.ondestory)

Java 在服务中保存持久数据的最佳时间(不总是调用Service.ondestory),java,android,Java,Android,我正在开发一个小型金融应用程序,其中包含一个活动和一个定期更新数据的后台服务。我使用AlarmManager+PendingEvent在后台定期更新数据,即使活动已被销毁。当该服务在后台自行运行时,系统会不时终止该服务,但在onStartCommand中返回START_STICKY后,系统会在短时间内自动重新启动该服务 问题就在这里。我将保存持久数据的代码放在Service.ondestory()中。但是,当系统出于自愿终止我的服务时,不会调用service.ondestory()。那么,我还应

我正在开发一个小型金融应用程序,其中包含一个活动和一个定期更新数据的后台服务。我使用AlarmManager+PendingEvent在后台定期更新数据,即使活动已被销毁。当该服务在后台自行运行时,系统会不时终止该服务,但在onStartCommand中返回START_STICKY后,系统会在短时间内自动重新启动该服务

问题就在这里。我将保存持久数据的代码放在Service.ondestory()中。但是,当系统出于自愿终止我的服务时,不会调用service.ondestory()。那么,我还应该在哪里保存数据呢?我可以在每次数据修改操作时保存数据。但这似乎相当浪费CPU和I/O操作

那么,我还应该在哪里保存数据呢

当数据更改时,以异步方式

我可以在每次数据修改操作时保存数据。但这似乎相当浪费CPU和I/O操作

那么,您的问题在于使用
AlarmManager
。如果您担心做这项工作的成本,那么就不要经常做这项工作,或者让用户控制完成这项工作的频率


服务中保存的数据
,与静态数据成员中保存的数据一样,只是一个缓存,应该这样对待。

用户可以选择控制频率。它可以设置为几秒钟或一小时。我们无法控制用户的行为。然而,作为一个操作系统,在没有任何通知或回调的情况下终止一个服务似乎是不合理的。@StephenCheng:“在没有任何通知或回调的情况下终止一个服务似乎是不合理的”——欢迎你发表意见。这并没有改变Android可能不会对您的服务调用
onDestroy()
。这可能是在高优先级RAM要求的情况下(例如,来电),用户强制停止您的应用程序,或者您的服务存在未处理的异常。通常会调用
ondestory()
。然而,数据持久性应该比简单的“正常”更可靠。没有传入呼叫。我也没有强迫你停下来。我只是关掉手机屏幕,让它去睡觉。几秒钟后,我的服务就终止了。但是系统很快就会重新启动它。@StephenCheng:那么要么你在使用
bindService()
而不是
startService()
,要么你在代码中的某个地方调用
stopService()
/
stopSelf()
,要么你的设备制造商行为不端。此外,请记住,当设备进入睡眠状态时,CPU会关闭。这不会终止进程或停止服务,但会暂停所有当前操作,就像桌面操作系统上的“暂停”模式一样。@StephenCheng:请记住,我前面的评论中的
bindService()
stopService()
场景将触发调用
onDestroy()
。我的第一条评论是引用了您的服务可能无法调用
onDestroy()
的情况。而且,由于这些情况的存在(无论它们是否是当前测试方案的一部分),您不能依赖调用
onDestroy()
,并且需要在发生更改时保持数据更改。