android – 在方向更改期间保持服务运行

前端之家收集整理的这篇文章主要介绍了android – 在方向更改期间保持服务运行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的应用程序中,我有一个服务,负责管理与外部设备的蓝牙连接.此服务类定期轮询外部蓝牙设备的数据,并将最新数据添加到缓存(或可能是SD卡)内存中的日志中.

在我拥有的各种Activity类中,有一个特定的Activity代表主UI.它负责以图形形式显示基于缓存文件数据的记录数据.我们将此活动称为仪表板.用户可以在该图表上来回滚动,以查看自应用程序启动以来收集并记录在缓存中的数据.

出于这个问题的目的,有两种操作模式需要考虑.用户可以选择“登录到SD卡”选项,由此应用程序必须继续轮询并记录到SD卡,即使所有活动类都被杀死(例如,用户已经返回到启动器).在这种情况下,我的服务使用.startService()启动并继续运行,并且只有在用户再次调用应用程序并禁用SD卡日志记录时才会停止.另一种模式是用户没有选择“登录到SD卡”,在这种情况下,服务仍在管理蓝牙连接,轮询和记录到高速缓存,以便在图形上直观显示数据,但仅限于在使用仪表板活动时需要这样做.

我目前所拥有的是Dashboard Activity最初使用bindService()绑定到Service,并在onPause()方法中对unbindService()进行相应的调用(否则我当然会泄漏Service).

问题是服务需要维护蓝牙连接并在方向更改期间或用户通过顶部调用另一个活动(例如检查电子邮件)时继续记录.现在,如果用户选择“登录SD卡”导致调用startService(),那么当然没有问题.问题当然是如何区分被销毁的活动然后由于方向(或其他一些配置)的改变而再次创建,并因为用户返回启动器而被销毁.在前一种情况下,我不希望服务数据记录被中断.在后一种情况下,如果用户没有选择“登录SD卡”,我希望服务停止.

我现在能想到的最佳解决方案是始终使用startService()启动服务,以便在Dashboard被销毁时继续运行.我接下来要做的是在服务中实现超时,除非启用连续SD卡日志记录,否则服务将自行停止,或者仪表板在五秒钟内再次处理(比如说)并重新绑定到服务.这似乎有点粗糙,我不禁想到这必须是一个常见的设计问题,有一个我忽略的更好的解决方案.

解决方法

您可以使用的一种方法是在onPause()中解除绑定之前检查Activity是否isFinishing().如果它正在完成,您可以将解除绑定推迟到onDestroy()方法.但是,在调用onDestroy()之前,您可以在onRetainNonConfigurationInstance()方法中保留ServiceConnection.如果你确实执行了持久性,那么你根本就不会在你的onDestroy()中调用unBind(),只需让你的Activity的新实例进行解除绑定.

话虽这么说,根据您的应用程序,您可能会发现启动/停止服务更容易.

猜你在找的Android相关文章