在睡眠模式下进行BLE扫描

时间:2016-05-30 10:15:56

标签: android android-service android-wake-lock android-background android-ble

我正在开发一个使用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);
}

和来自Google的scanLeDevice

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);
}

它只是第一次工作。在各种帖子中我读过:“不可能获得唤醒锁并多次发布”。 谢谢。

0 个答案:

没有答案
相关问题