android - 如何将切换按钮状态与前台服务同步?

标签 android sharedpreferences android-service android-service-binding

我有一个前台服务,我在 Activity 中使用切换按钮启动和停止该服务。为了跟踪服务是否正在运行,我使用了一个存储在 SharedPreference 中的变量。

这是流程

When a user enables toggle button

startService()     start background work  
makeForeGround()              
bindService()      to get update

When a user disables toggle button

unbindService()    to stop getting updates    
stopForeGround()          
stopService()      stop background work  

当用户离开 Activity 时

unbindService(); To stop getting the update. 
                 But the service is running for background work

When a user reenters the Activity

if(Service is running)
Show toggle button state as enabled 
bindService() 

我都做到了。

我面临的唯一问题是:

有时我的服务会被操作系统杀死。在那种情况下,我没有办法 更新我的 SharedPreference 变量。因此无法同步我的 Toggle 带有服务的按钮。

我如何收到服务已被操作系统终止的通知。 (因为在这种情况下没有调用 onDestroy() )?我也经历了How to check if a service is running on Android? ,但遗憾的是,所提供的解决方案和方法已被弃用。

最佳答案

您应该考虑从不同的方向解决您的问题。

试图推断系统何时终止您的Service 是有问题的。应用程序(服务)在终止时不会收到通知,因此很难检测到这种情况。然而,找出 Service 何时启动是微不足道的 (onCreate())。这是正确方法的线索。

很明显,您了解在 ActivityService 之间交换信息的正确方法是通过绑定(bind)。这是解决方案的另一个关键部分。

解决方案

您应该延长Service 的生命周期。现在,您创建 Service 的明确目的似乎是执行一项长时间运行的任务。 Service 在您希望任务开始时创建,并在任务结束时立即终止。换句话说,服务和“任务”的范围是一样的。

相反,您应该使“任务”成为 Service 的子级; Service 的存在时间应该比“任务”长一些。特别是,Service 应该在 Activity 启动时可用(如果只是为了将有关“任务”状态的信息传递给 Activity ).

每当 Activity 启动时,它应该绑定(bind)到 Service,并向 Service 注册一个监听器。 Service 会在 A.) 新注册监听器,或 B.) “任务”更改状态(开始或停止)时调用此监听器。因此,只要 Activity 绑定(bind)到 Service,它总是会立即收到状态更改的通知。

Activity 希望“任务”改变状态时,它应该通过绑定(bind)(或者可能是 startService())通知 Service > 调用,即使 Service 已经在运行)。 Service 然后将启动/停止后台线程(或您为完成“任务”所做的任何操作),并通知所有监听器。

如果Service已经运行了一段时间的“任务”,突然弹出Activity,那么Service就清楚的知道这个“任务”存在,Activity 将在绑定(bind)后立即通过监听器获取该信息。

Activity 停止时,它应该通过注销其监听器并从 Service 解除绑定(bind)来进行清理。

这种方法不需要 SharedPreferences,也不需要检测 Service 何时停止。每当创建 Service 时,显然“任务”没有运行,因此 Service 将始终知道要给 Activity 的正确答案.由于必须先创建 Service 才能绑定(bind)到 Activity,因此不存在操作顺序问题。

关于android - 如何将切换按钮状态与前台服务同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55277046/

相关文章:

android - 服务中的 SurfaceView

android - 从主屏幕开始 Activity

android-studio - 首选项库导致 E/libc & E/Pref 错误

Android 在 Play 商店推送更新

android - Android 中的并排单选按钮

Android Build from source find - 没有这样的文件目录错误

java - 听取偏好变化

android - AlarmManager 与 Handler.postDelayed

java - android 如何在android的Asynctask中加载sqlite数据

android - 谷歌地图获取方向搜索算法