gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:37 24 4
gpt4 key购买 nike

在我的应用程序中,我有一个 Service 负责管理与外部设备的蓝牙连接。此 Service 类定期轮询外部蓝牙设备的数据,并将最新数据添加到缓存(或可能是 SD 卡)内存中的日志中。

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

为了这个问题的目的,有两种操作模式需要考虑。用户可以选择“记录到 SD 卡”选项,即使所有 Activity 类都被杀死,应用程序也必须继续轮询和记录到 SD 卡(例如,用户已经离开返回启动器)。在这种情况下,我的 Service 使用 .startService() 启动并继续运行,只有当用户再次调用应用程序并禁用 SD 卡日志记录时才会停止。另一种模式是用户没有选择“log to SD card”,此时Service仍在管理蓝牙连接,轮询并记录到缓存内存,目的是直观地显示图表上的数据,但只需要在使用 Dashboard Activity 时这样做。

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

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

目前我能想到的最佳解决方案是让服务始终使用startService() 启动,以便在仪表板 已被销毁。然后我要做的是在 Service 中实现超时,Service 将自行停止除非启用连续 SD 卡日志记录, Dashboard 在五秒内(比方说)再次被onCreated 并重新绑定(bind)到Service。这似乎有点粗糙,我不禁想到这一定是一个常见的设计问题,但有一个我忽略的更好的解决方案。

最佳答案

选项 1:如果您希望销毁服务,则在主要 Activity 结束时立即销毁,而不是在轮换期间销毁:

为避免服务自动停止,您必须在绑定(bind)前手动启动它:

protected void onStart() {
Intent intent = new Intent(getApplicationContext(), MServcie.class);
startService(intent);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}

仅当您的 Activity 完成时才停止服务!

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);
}

关于android - 在方向更改期间保持服务运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8360646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com