我一直在扫描 BLE 设备。现在在 android oreo 中,操作系统会自动关闭服务,有没有办法在应用程序被杀死后进行扫描?
我探索过
1.) 带通知的前台服务[糟糕的用户体验]
2.) 周期性作业调度[低效]
3.) 使用无障碍服务 [android 扫除使用它而不帮助残疾人的应用程序] 或者有没有办法获得事先批准?
如果我遗漏了什么,请告诉我
最佳答案
对于全功率扫描,您对选项的总结是准确的。我写了一个 blog post关于这一点,权衡了不同选择的利弊。
在Android Beacon Library我们默认选择使用 JobScheduler。这最多可以在后台每 15 分钟运行一次。 IMO,时机是这种方法的真正缺点。考虑到工作启动每 15 分钟才发生一次,它的重量稍重且效率较低这一事实并不重要。
该库最近还添加了对可选配置 foreground service 的支持。以更频繁地启用扫描。对于许多用例,持续通知是可以接受的,尽管这对其他用例来说确实是一个缺点。
不幸的是,Android 没有白名单或特殊批准流程来让您绕过此限制。您唯一的选择是,如果您是设备制造商并且可以在您自己的自定义 Android 版本中自定义规则执行.
您没有提到Android Beacon 库使用的一个替代方法是使用一个新的 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+ 上正常运行。
关于java - 如何在 android oreo 中运行持续的后台服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50825772/