我一直在查看 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。然后这个 App 转到 onPause(),假设另一个 App 转到前台。并且永远不会调用 stopLEScan。
此时,Android 是否继续进行 LE 扫描?
在 startLeScan 的某个时刻,它会打开实际的硬件。但是 App 已经设置了 onPause() 并且硬件可能会继续打开。
最佳答案
是的,即使您的应用程序在后台,扫描也会继续运行,如果找到蓝牙设备,您的 onLeScan() 回调将被调用。
这很容易测试,只需开始扫描,然后通过主页按钮退出应用程序,打开我的蓝牙外围设备,然后查看日志。您还可以在回调中放置一个断点,即使您的应用不在前台,该断点也会被触发。
扫描会耗尽电池电量,因此根据您要完成的任务,最佳做法是在 onPause() mBluetoothAdapter.stopLeScan(mDeviceFoundCallback)
中停止扫描,如果需要重新启动扫描你的 onResume() mBluetoothAdapter.startLeScan(mDeviceFoundCallback)
。
如果出于某种原因您需要长时间运行的后台蓝牙 Activity (例如,您正在实现 Proximity Profile 并需要定期检查信号强度),那么该功能应该进入服务实现,如您链接到的文档中所示: http://developer.android.com/guide/topics/connectivity/bluetooth-le.html
关于Android - 如果应用程序进入暂停状态(进入后台),是否会调用应用程序的 LeScanCallback?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21000724/