【发布时间】:2020-07-19 06:24:00
【问题描述】:
我刚刚开发了一个 Android 应用(minSdkVersion 23/targetSdkVersion 29),它可以连接到蓝牙设备以定期获取数据。
现在,在 MainActivity(不是第一个活动)中,我执行以下注册广播接收器:
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(意图)中以在 UI 中进行更改(尽管在后台没有必要)。
另一方面,我也必须始终保持一个 bakground 进程,因为我的应用程序启动 BLE 广告以使手机成为 LE 设备,因此必须始终“开机”以使其他设备找到手机.
问题是,当我将应用程序置于后台或终止应用程序时,此计划不会执行或执行几次,直到进程被 android 终止。
在后台模式下执行此服务的最佳方法是什么?考虑到如果应用程序被终止,设备(我认为)将断开连接,因此我应该再次连接到设备(我保存MAC地址重新连接所以没问题)并执行requestData方法? WorkManager/JobScheduler/AlarmManager/ForegroundService?
有人可以帮助我了解如何实施和理解后台生命周期以及如何访问我需要在后台管理的所有数据吗?
谢谢!
【问题讨论】:
-
感谢您的快速回答!!我还有一个问题,我也必须始终保持后台进程,因为我的应用程序启动 BLE 广告以使手机成为 LE 设备,因此必须始终“开机”才能让其他设备找到它。我怎样才能做到这一点 ?这是可能的?或者我必须每分钟都尝试使用 workmanager(例如)?
标签: android background-process android-bluetooth android-workmanager android-jobscheduler