如何在安卓Oreo系统上运行一个持续的后台服务?

4

我正在不断地扫描BLE设备。现在,在Android Oreo中,操作系统会自动关闭服务,有没有一种方法可以在应用程序被杀死后继续扫描?

我已经尝试了以下方法:
1.) 含通知的前台服务 [用户体验差]
2.) 周期性作业调度 [效率低下]
3.) 使用辅助功能服务 [Android将使用它的应用程序清除,而不帮助残障人士],或者是否有一种获取先前授权的方法?

如果我漏掉了什么,请告诉我。


不同意。在Android 8中,您可以配置通知渠道,将优先级设置为IMPORTANCE_MIN,这意味着没有声音,没有振动,除非您打开通知中心,否则不可见,因此不会干扰用户,也不会影响UX。在这里检查我的答案https://stackoverflow.com/a/50454453/9771840 - Marc Estrada
我认为前台服务无法以最低优先级运行,否则它会被杀掉。@MarcEstrada - Divye Shah
我使用了一个IntentService,它运行了几秒钟。没有尝试过使用永久服务。 - Marc Estrada
1个回答

1

针对全功率扫描,你对选项的总结是准确的。我写了一篇博客文章,权衡了不同选项的利弊。

Android Beacon Library中,我们默认使用JobScheduler。这可以在后台最多每15分钟运行一次。在我看来,时间是这种方法的真正缺点。考虑到工作启动只发生在每15分钟一次,它稍微重量级和效率低下并不重要。

该库还最近添加了支持,可选择配置前台服务以更频繁地进行扫描。对于许多用例,持久通知是可以接受的,但对于其他用例来说,这是一个真正的缺点。

不幸的是,Android没有白名单或特殊批准流程来绕过此限制。你唯一的选择是如果你是设备制造商,并且可以自定义自己的Android版本中的规则执行。

你没有提到的一种替代方案是使用 Android Beacon Library,它使用了一个新的 Android O API,可以通过 intent 将扫描结果传递给 BroadcastReceiver。这与扫描过滤器结合使用非常有效,如果检测到特定兴趣的 BLE 数据包,则唤醒您的应用程序。但是,一旦检测到一个数据包,您的进程在此扫描期间不会运行,但可以运行一个后台服务,仅限于 Android 8 上发生此类检测后的常规 10 分钟限制。下面的示例将结果传递给 MyBroadcastReceiver

 Intent intent = new Intent(mContext, MyBroadcastReceiver.class);
 PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

 int result = bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, pendingIntent);

通过使用上述技术的组合,大多数蓝牙扫描应用程序仍可在Android 8+上正常工作。

我不能使用作业调度程序,因为退出和进入事件非常重要和时间特定,但是这个广播接收器似乎很有趣,即使应用程序已被杀死,它也会唤醒该应用程序,是吗?再次感谢! - Divye Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接