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