Android Oreo系统中AltBeacon库的BLE扫描机制探究
我来给你梳理下AltBeacon库针对Android Oreo(API 26+)后台服务限制做出的BLE扫描调整方案——毕竟之前Android L及更早版本的那套逻辑在Oreo之后完全跑不通了:
先回顾下旧版本(Android L之前)的扫描逻辑
- 前台模式:默认采用短周期循环扫描,每次扫描1.1秒,之后进入休息间隔
- 后台模式:依赖
AlarmManager每5分钟唤醒应用,执行10秒的扫描任务,全程靠后台服务支撑
Android Oreo及以上的核心适配调整
因为Oreo严格禁止了长期后台服务,AltBeacon主要做了以下关键改动:
前台服务绑定扫描(后台持续扫描的唯一可行方案)
如果需要在后台持续稳定扫描,必须把扫描逻辑绑定到前台服务,并且要显示一个持久的系统通知(这是Android系统的强制要求,否则服务会被系统立即杀死)。你可以通过BeaconManager.enableForegroundServiceScanning()方法开启这个模式,同时需要自定义通知的标题、图标等内容。
前台服务模式下的扫描周期可以自定义,默认逻辑和旧版本的前台扫描类似,还是短周期循环(比如扫描1.1秒+休息间隔),但因为是前台优先级,系统不会限制它的运行时长。无前台服务时的后台扫描限制
如果不使用前台服务,后台扫描会受到系统的严格管控:- 扫描间隔会被系统强制拉长到约15分钟一次(这个时间由系统控制,库本身无法修改),每次扫描的时长也被限制在几秒内
- 此时AltBeacon会改用
JobScheduler来调度后台扫描任务,替代之前的AlarmManager,因为JobScheduler更符合Oreo之后的后台任务规范,系统会在资源充足时才执行扫描
扫描权限的升级要求
除了旧版本需要的BLUETOOTH_ADMIN和BLUETOOTH权限,Oreo及以上还必须申请ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION危险权限(需要动态申请);如果是Android 12(API 31)及以上,还得额外申请BLUETOOTH_SCAN和BLUETOOTH_ADVERTISE权限,且后台扫描时必须获取ACCESS_BACKGROUND_LOCATION权限(这个权限需要用户手动去设置里授权,系统不会自动弹出请求弹窗)
额外提一句:如果你需要自定义前台扫描的时长和间隔,可以用BeaconManager.setForegroundScanPeriod()和BeaconManager.setForegroundBetweenScanPeriod()方法来调整;但后台扫描因为系统限制,已经没法像旧版本那样自由设置“每5分钟扫描10秒”的规则了。
内容的提问来源于stack exchange,提问作者Aniket Thakur

