java - 如何在 android oreo 中运行持续的后台服务?

标签 java android service android-8.0-oreo beacon

我一直在扫描 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/

相关文章:

Grails如何在 Controller 上调用MyUserDetailsS​​ervice?

delphi - EXE文件右键菜单

android - 从服务中的线程更改主 Activity 用户界面

java - 如何检查 char 数组中的至少一个元素是否在字符串中? ( java )

java - 如何使用网络服务API?

android - 为 android 扩展 MediaController

android - 为什么AlertDialog.Builder 为自定义布局(Tablelayout)显示半空对话框

android - 如何在android :label?中添加上标文本

java - 在 JAVA 中为 MySQL PreparedStatment 绑定(bind) NULL?

java - @FXML 注释和 FXMLLoader 类未解析为 Java 11 和 JavaFX 11 中的类型