我正在使用 ble 开发一个 android 应用程序。我想每 10 秒安排一次扫描。它可以工作,但是当我的设备在后台时,它不起作用。
在 Oncreate() 我调用 StartHandler();
public class MyService extends Service{
......
....
public void StartHandler(){
handlerScan = new Handler();
handlerScan.postDelayed(new Runnable() {
public void run() {
if (!STOP) {
scanLeDevice(true);
handlerScan.postDelayed(this, 8000);
}else{
handlerScan.postDelayed(this, 3000);
}
}
}, 500);
}
并从谷歌扫描LeDevice
public void scanLeDevice(final boolean enable) {
if(mLeScanCallback == null){
mBluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
mBluetoothAdapter = mBluetoothManager.getAdapter();
try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }
}
if (enable) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}, 3000);
mScanning = true;
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
- 这是设备未处于睡眠状态时的工作。我曾尝试使用 AlarmManager,但重复警报的最短时间为 1 分钟。
- TimerTask 在睡眠模式下不起作用。
- 处理程序在睡眠模式下不起作用。
我想使用 WakeLock 但如果我在这里获得它:
public void StartHandler(){
handlerScan = new Handler();
handlerScan.postDelayed(new Runnable() {
public void run() {
if (!STOP) {
wakelock.acquire();
scanLeDevice(true);
handlerScan.postDelayed(this, 8000);
}else{
handlerScan.postDelayed(this, 3000);
}
}
}, 500);
}
并在 scanLeDevice 中释放我的唤醒锁
public void run() {
mScanning = false;
wakelock.release();
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
它只在第一次工作。在我读过的各种帖子中:“不可能多次获取唤醒锁并释放”。谢谢你。