Android - 如果应用程序进入暂停状态(进入后台),是否会调用应用程序的 LeScanCallback?

标签 android callback bluetooth-lowenergy

我一直在查看 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/

相关文章:

java - 在 TextWatcher for Android 中控制事件的触发

java - Android 使用 Retrofit Service 将数据同步到内部存储

android - 自定义 ViewGroup 中的自定义 View 应该使用 onDraw() 还是 layout()?

javascript - 向 jquery 小部件添加回调

c - C 中的通用函数类型回调,如 javascript

Android连接BLE模块并通过串口发送数据

ios - 从 Swift 写入 BLE 外设

java - 以尺寸单位硬编码按钮的宽度

ajax - 从事件回调之一内部调用 JQuery.ajax 或 JQuery.post 会导致来自 Moment.min.js 的类型错误

c++ - 如何从 C++ 代码扫描并连接广告 BLE 设备?