我正在开发一个将启动后台任务的android应用程序,最终用户需要能够停止后台任务。我的做法是:
- 启动活动
- 活动绑定到服务
- Activity 使用针对服务的意图启动服务
- 服务启动后台任务并从 onStartCommand 返回 START_STICKY
- 稍后,用户返回活动
- Activity 重新绑定并重启服务
- Activity 使用从返回的 IBinder 公开的方法告诉服务停止后台任务
使用服务背后的原因是,我最初认为该服务会在应用程序的整个生命周期内保持活动状态,但我发现 android 平台必须在稍后杀死我的服务并重新启动它(通过收到 null 确认onStartCommand 中的意图)。不过,这没什么大不了的,只要我仍然可以处理后台任务,这样我就可以杀死它。所以我现在的方法是将后台任务的引用存储在服务类中的静态变量中。我对此并不疯狂,但它似乎应该工作。我面临的问题是,当服务重新实例化时,我的静态变量已被重置,即对任务的引用为空(以及其他静态变量)。这就是我感到困惑的地方。是一个安卓“进程” 和传统的java进程不一样?我不明白为什么它不会,如果是,那么静态变量应该保持它们的状态。如果不是,新的服务实例应该如何停止先前启动的任务?
我没有在清单中使用任何特殊的“进程”属性,只是默认值。