我正在不断地扫描BLE设备。现在,在Android Oreo中,操作系统会自动关闭服务,有没有一种方法可以在应用程序被杀死后继续扫描?
我已经尝试了以下方法:
1.) 含通知的前台服务 [用户体验差]
2.) 周期性作业调度 [效率低下]
3.) 使用辅助功能服务 [Android将使用它的应用程序清除,而不帮助残障人士],或者是否有一种获取先前授权的方法?
如果我漏掉了什么,请告诉我。
我正在不断地扫描BLE设备。现在,在Android Oreo中,操作系统会自动关闭服务,有没有一种方法可以在应用程序被杀死后继续扫描?
我已经尝试了以下方法:
1.) 含通知的前台服务 [用户体验差]
2.) 周期性作业调度 [效率低下]
3.) 使用辅助功能服务 [Android将使用它的应用程序清除,而不帮助残障人士],或者是否有一种获取先前授权的方法?
如果我漏掉了什么,请告诉我。
针对全功率扫描,你对选项的总结是准确的。我写了一篇博客文章,权衡了不同选项的利弊。
在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);