我刚刚完成了一个iOS应用程序的开发,即使该应用程序处于挂起状态或被操作系统关闭,它也可以在后台从BLE外设获取读数。即使在一周或更长时间之后,该应用仍可以获取读数。
我们的BLE外围设备以随机(基本上)的时间间隔发送广告,并且设备在很短的时间(几秒钟左右)后掉电。
我想对Android进行同样的操作,但只能通过请求用户通过以下方式禁用电池优化来做到这一点:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
我对这种解决方案真的不满意,但是当我删除此许可后,当设备锁定并拔出电源时,我的应用几乎立即停止工作。结果,我相信这与Doze功能有关。
基本上我要扫描的内容(为简便起见,将其重新组织)是这样的:
A)安排数据收集作业
JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName serviceName = new ComponentName(context, DataCollectionService.class);
jobInfo = new JobInfo.Builder(1, serviceName)
.setPeriodic(900000)
.setPersisted(true)
.build();
jobScheduler.schedule(jobInfo);
B)这项工作(DataCollectionService.class)看起来像这样:
public boolean onStartJob(JobParameters params) {
context = this;
bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
// Omitted several checks for this post.
scanFilter = new ScanFilter.Builder().setServiceUuid(new ParcelUuid(DataCollectionService.SERVICE_UUID)).build();
builder = new ScanSettings.Builder();
settings = builder.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
.build();
scanner = bluetoothAdapter.getBluetoothLeScanner();
if (scanFilter == null) {
EventEmitter.sendError("Failed to get reference to bluetooth le scanner");
}
mHandler = new Handler();
mHandler.post(startRunnable);
return true;
}
C)添加/请求权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
当然还有我想避免获得的许可:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
我还通过编程方式请求位置(自API 23开始)和电池优化权限。
我主要想知道是否正在做的某件事会导致我的应用程序进入这种状态(设备锁定和拔出)后,这么快就开始丢失BLE外围设备广告。