如何在android oreo中运行常量后台服务?

时间:2018-06-12 21:00:25

标签: java android service android-8.0-oreo beacon

我正在不断扫描BLE设备。现在在android oreo中操作系统会自动关闭服务,即使应用程序被杀死,还有办法扫描吗?

我已经探索过了 1.)带有通知的前台服务[糟糕的用户体验]
2.)定期工作时间表[低效]
3.)使用辅助功能服务[android扫描使用它的应用程序而不帮助残疾人]或者有没有办法事先得到批准?

如果我遗失了某些内容,请告诉我

1 个答案:

答案 0 :(得分:1)

对于全功率扫描,您对这些选项的摘要是准确的。我写了blog post关于这一点,它衡量了不同选项的优缺点。

Android Beacon Library我们默认选择使用JobScheduler。这可以在后台运行最多每15分钟一次。 IMO,时机是这种方法的真正缺点。如果工作启动仅每15分钟发生一次,那么它的重量和效率会更高,这一事实并不重要。

该图书馆最近还添加了支持,可选择配置foreground service以更频繁地启用扫描。对于许多用例,持久性通知是可以接受的,尽管这对其他用户来说是一个真正的缺点。

不幸的是, Android没有白名单或特殊审批流程来帮助您解决此限制。您唯一的选择是,如果您是设备制造商,并且可以在您自己的自定义Android版本中自定义规则实施

您未提及的另一个选择 Android Beacon Library使用的是使用新的Android O API,您可以通过意图将扫描结果传送到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 +上正常运行。