在我的应用程序中,我有一个Service
它负责管理与外部设备的蓝牙连接。这Service
类定期轮询外部蓝牙设备以获取数据,并将最新数据添加到缓存(或可能是 SD 卡)内存中保存的日志中。
其中各种Activity
我的课程中有一个特别的Activity
代表主 UI。它负责以图形形式显示基于缓存文件数据的记录数据。我们称之为Activity
the Dashboard
。用户可以在该图表上来回滚动,以查看自应用程序启动以来在缓存中收集和记录的数据。
出于此问题的目的,需要考虑两种操作模式。用户可以选择“记录到 SD 卡”选项,由此应用程序必须继续轮询并记录到 SD 卡,即使所有情况下也是如此。Activity
类被杀死”(例如,用户已返回启动器)。在这种情况下我的Service
开始使用.startService()
并继续运行,并且仅当用户再次调用应用程序并禁用 SD 卡日志记录时才会停止。另一种模式是用户没有选择“登录到SD卡”,此时Service
仍在管理蓝牙连接、轮询并记录到缓存内存,以便在图表上直观地显示数据,但只需要在Dashboard
Activity
正在使用中。
我现在所拥有的是Dashboard
Activity
最初绑定到Service
using bindService()
,并进行相应的调用unbindService()
内onPause()
方法(否则我当然会泄漏Service
).
问题是Service
需要保持蓝牙连接并在方向改变期间或当用户调用另一个时继续记录Activity
超出顶部(例如检查电子邮件)。现在,如果用户选择“登录到 SD 卡”,则会调用startService()
那么当然就没有问题了。当然,问题是如何区分Activity
由于方向(或其他配置)更改而被销毁,然后再次创建,并且由于用户返回到启动器而被销毁。在前一种情况下,我不想要Service
数据记录已被中断。在后一种情况下,我想要Service
停止,if用户没有选择“登录到SD卡”。
目前我能想到的最好的解决方案是服务always开始使用startService()
,以便它继续运行时Dashboard
已被摧毁。然后我要做的是在Service
,由此Service
会自行停止unless启用连续 SD 卡记录,or the Dashboard
is onCreate
d 在五秒内再次(比如说)并重新绑定到Service
。这看起来有点粗糙,我不禁认为这一定是一个常见的设计问题,有一个我忽略的更好的解决方案。
选项 1:如果您希望在主活动完成时立即销毁服务,但不在轮换期间销毁:
为了避免服务自动停止,您必须在绑定之前手动启动它:
protected void onStart() {
Intent intent = new Intent(getApplicationContext(), MServcie.class);
startService(intent);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
仅当您的活动完成时才停止服务!
protected void onStop() {
if (service != null) {
unbindService(connection);
service = null;
if (isFinishing()) {
stopService(new Intent(getApplicationContext(), MyServcie.class));
}
}
}
选项 2:如果您希望操作系统决定何时停止服务。
protected void onStart() {
Intent intent = new Intent(this, MServcie.class);
getApplicationContext().bindService(intent, this, Context.BIND_AUTO_CREATE);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)