在我拥有的各种Activity类中,有一个特定的Activity代表主UI.它负责以图形形式显示基于缓存文件数据的记录数据.我们将此活动称为仪表板.用户可以在该图表上来回滚动,以查看自应用程序启动以来收集并记录在缓存中的数据.
出于这个问题的目的,有两种操作模式需要考虑.用户可以选择“登录到SD卡”选项,由此应用程序必须继续轮询并记录到SD卡,即使所有活动类都被杀死(例如,用户已经返回到启动器).在这种情况下,我的服务使用.startService()启动并继续运行,并且只有在用户再次调用应用程序并禁用SD卡日志记录时才会停止.另一种模式是用户没有选择“登录到SD卡”,在这种情况下,服务仍在管理蓝牙连接,轮询和记录到高速缓存,以便在图形上直观显示数据,但仅限于在使用仪表板活动时需要这样做.
我目前所拥有的是Dashboard Activity最初使用bindService()绑定到Service,并在onPause()方法中对unbindService()进行相应的调用(否则我当然会泄漏Service).
问题是服务需要维护蓝牙连接并在方向更改期间或用户通过顶部调用另一个活动(例如检查电子邮件)时继续记录.现在,如果用户选择“登录SD卡”导致调用startService(),那么当然没有问题.问题当然是如何区分被销毁的活动然后由于方向(或其他一些配置)的改变而再次创建,并因为用户返回启动器而被销毁.在前一种情况下,我不希望服务数据记录被中断.在后一种情况下,如果用户没有选择“登录SD卡”,我希望服务停止.
我现在能想到的最佳解决方案是始终使用startService()启动服务,以便在Dashboard被销毁时继续运行.我接下来要做的是在服务中实现超时,除非启用连续SD卡日志记录,否则服务将自行停止,或者仪表板在五秒钟内再次处理(比如说)并重新绑定到服务.这似乎有点粗糙,我不禁想到这必须是一个常见的设计问题,有一个我忽略的更好的解决方案.