[英]Android - Would LeScanCallback of an App get called if the App goes onPause (to the background)?
我一直在http://developer.android.com/guide/topics/connectivity/bluetooth-le.html上查看BLTE示例代碼
public class DeviceScanActivity extends ListActivity {
private BluetoothAdapter mBluetoothAdapter;
private boolean mScanning;
private Handler mHandler;
// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;
...
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
...
}
...
}
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};
現在,我注意到這段代碼在調用startLeScan時提供了一個LeScanCallback。
假設此應用程序通過startLeScan。 然后這個應用程序轉到onPause(),說另一個應用程序轉到前台。 並且永遠不會調用stopLEScan。
此時,Android是否繼續進行LE掃描?
在startLeScan的某一點,它打開了實際的硬件。 但是應用程序已經使用onPause()並且硬件可能會繼續運行。
是的,即使您的應用程序在后台,掃描也會繼續運行,如果找到藍牙設備,您的onLeScan()回調將被調用。
只需啟動掃描然后通過主頁按鈕退出應用程序,打開藍牙外設,然后查看日志,即可輕松測試。 您還可以在回調中刪除一個斷點,即使您的應用不在前台,也會受到影響。
掃描耗盡電池,因此根據您要完成的操作,最佳做法是在onPause() mBluetoothAdapter.stopLeScan(mDeviceFoundCallback)
停止掃描,如果需要在onResume() mBluetoothAdapter.startLeScan(mDeviceFoundCallback)
重新啟動掃描mBluetoothAdapter.startLeScan(mDeviceFoundCallback)
。
如果由於某種原因您需要長時間運行背景藍牙活動(例如,您正在實施接近配置文件並需要定期檢查信號強度),那么該功能應該進入服務實現,如您鏈接到的文檔中所示: http: //developer.android.com/guide/topics/connectivity/bluetooth-le.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.