由于最近对后台服务和隐式广播的限制,Android开发人员只能使用JobScheduler以及更高级别的WorkManager来安排后台任务。
WorkManager的Worker类非常简单,但是我对实现正在进行的工作而不是一次性工作的最佳方法有些困惑。在我们的示例中,让我们考虑蓝牙低功耗扫描,但是同样的顾虑也适用于所有正在进行的不确定的工作。
这样的事情显然是行不通的:
public class MyWorker extends Worker {
private BluetoothLeScanner mBluetoothLeScanner;
@Override
public Worker.Result doWork() {
mBluetoothLeScanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();
// Pretend there's some bluetooth setup here
// ...
mBluetoothLeScanner.startScan( .. , .. , .. );
return Result.SUCCESS;
}
}
Run Code Online (Sandbox Code Playgroud)
上面我们开始扫描,然后立即超出范围,因此扫描将不会继续。
我们可以使用wait()/ notify()解决这个问题,但是感觉很脏。像这样
public class MyWorker extends Worker {
private BluetoothLeScanner mBluetoothLeScanner;
private final Object mLock = new Object();
private Handler mBackgroundHandler;
private Handler getBackgroundHandler() {
if (mBackgroundHandler == null) {
HandlerThread …Run Code Online (Sandbox Code Playgroud) android background bluetooth bluetooth-lowenergy android-workmanager