Android后台蓝牙处理: What's the best approach?

标签 android background-process android-bluetooth android-workmanager android-jobscheduler

我刚刚开发了一个 Android 应用程序(minSdkVersion 23/targetSdkVersion 29),可以连接到 BluetoothLE 设备以定期获取数据。

现在,在 MainActivity(不是第一个 Activity )中,我执行以下注册 broadcastReciever 的操作:

public class StatusActivity extends AppCompatActivity {    
    BleService mBleService;
    BleScanCallback mScanCallback;
    BroadcastReceiver mBroadcastReceiver;    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mBroadcastReceiver = new LibBleBroadcastReceiver(this);
        IntentFilter intentFilter = new IntentFilter()    
        intentFilter.addAction(BleService.ACTION_GATT_CONNECTED);
        intentFilter.addAction(BleService.ACTION_GATT_DISCONNECTED);
        intentFilter.addAction(BleService.ACTION_GATT_SERVICES_DISCOVERED);
        intentFilter.addAction(BleService.ACTION_DATA_AVAILABLE);
        intentFilter.addAction(BleService.ACTION_DID_WRITE_CHARACTERISTIC);
        intentFilter.addAction(BleService.ACTION_DID_FAIL);
        registerReceiver(mBroadcastReceiver, intentFilter);
    
        mScanCallback = new LibBleScanCallback(this);
        intent = new Intent(this, BleService.class);
        connection = new LibBleServiceConnection(this);
    
        startService(intent);
        if (!bindService(intent, connection, Context.BIND_AUTO_CREATE)) {
            throw new IllegalStateException("bindService not successful");
        }
    }
    ...
    public void onDeviceDiscovered(String device_address){
        device_connected.activateNotifications(mBleService, connected_device);
        scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
            public void run() {
                device_connected.requestTemperature(mBleService, connected_device);
            }
        }, 0, 30, TimeUnit.MINUTES);
    }
    ...
}

在 AndroidManifest.xml 中声明了 BleService:

<service android:name=".bluetooth.BleService" android:enabled="true" />

然后,用户选择一个设备(通过蓝牙扫描)并连接到它以从 BLE 设备获取数据。

一旦连接并发现(服务和特征),我会安排每 30 分钟执行一次任务以从设备获取数据。

当设备连接/发现/收到数据时执行的所有回调都在 StatusActivity 中,而不是在 BleService( Intent )中以在 UI 中进行更改(尽管在后台没有必要)。

另一方面,我也必须始终保持一个 bakground 进程,因为我的应用程序启动了 BLE 广告以使手机成为 LE 设备,因此始终必须“开机”才能让其他设备找到手机.

问题是,当我将应用程序置于后台或终止应用程序时,此计划不会执行或执行几次,直到进程被 android 终止。

在后台模式下执行此服务的最佳方法是什么?考虑到如果应用被终止,设备(我认为)将断开连接,因此我应该再次连接到设备(我保存了 MAC 地址以重新连接,所以这不是问题)并执行 requestData 方法? WorkManager/JobScheduler/AlarmManager/ForegroundService?

有人可以帮助我了解如何实现和理解后台生命周期以及如何访问我需要在后台管理的所有数据吗?

谢谢!

最佳答案

在后台工作的唯一可行解决方案是 ForegroundService,当您的设备进入 Doze 模式时,其他解决方案将被销毁。您可以在 this article 中找到更多详细信息。 , 它描述了扫描 BLE 设备时后台工作的所有障碍。

关于Android后台蓝牙处理: What's the best approach?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62976974/

相关文章:

android - Android Q 中的深色主题配置更改

ruby-on-rails - 后台任务完成后如何通知用户?

c - 后台进程的信号处理

linux - 等待并行远程进程完成 bash ssh

java - 如何在android中实现应用内支付?

Android Recyclerview vs ListView with Viewholder

android - 使用二维码作为带外 (OOB) channel 的蓝牙安全简单配对 (SSP)

android - IllegalStateException 如果尝试从 onActivityResult 显示对话框

android - 哪些平台支持蓝牙 4.0 外设/从设备?

android - 如何在静态方法中获取此上下文