Saya memiliki 3 komponen.
Aktivitas1 memiliki tombol untuk menghubungkan dan memutuskan Koneksi BLE
Aktivitas2 Perlu Mendapatkan data dari Perangkat BLE.
Layanan Semua logika koneksi (seperti getRemoteDevice(),connectGatt, dll.,) milik layanan.
Activity1 terhubung ke Perangkat BLE dengan mengikat layanan.
Intent gattServiceIntent = new Intent(mContext,BleService.class);//In Activity1 context
bindService(gattServiceIntent, mServiceConnection,BIND_AUTO_CREATE);
dan membuat koneksi ke perangkat ble segera setelah tombol ditekan.
Sekarang ketika saya berpindah dari Aktivitas1 ke Aktivitas2 saya melepaskan ikatan layanan di Aktivitas1.
mContext.unbindService(mServiceConnection);//In Activity1 context
Sekarang Bagaimana cara menggunakan koneksi Perangkat BLE yang ada di Activity2?
Solusi sementara saya:
Saya Menghubungkan Kembali Perangkat BLE lagi ketika berpindah ke Aktivitas2 dengan instance layanan baru yang diikatkan padanya dari konteks Aktivitas2 . (Yang tidak saya inginkan.)
Di Activity2 saya memeriksa apakah layanan saya sudah berjalan jika belum berjalan maka saya mengikat layanan itu lagi dari Konteks Activity2.
if(!isMyServiceRunning(BleWrapper.class)){
Intent wrapperServiceIntent = new Intent(mContext,BleWrapper.class);
bindService(wrapperServiceIntent,mBLEWrapperServiceConnection,BIND_AUTO_CREATE);
}else{
Log.w(LOGTAG, "Service already connected. In onCreate");
}
memicu koneksi di onServiceConnected() di bawah panggilan balik ServiceConnection
@Override
public void onServiceConnected(ComponentName componentName,IBinder service) {
mBluetoothLeService = ((BleWrapper.LocalBinder) service).getService();
if (!mBluetoothLeService.initialize()) {
showAlertDialog(getString(R.string.ble_not_supported_on_this_device));
}else {
mBluetoothLeService = BleWrapper.getInstance();
}
mBluetoothLeService.connect(/*address from shared preference*/); //Reconnecting to the same device using address stored in Shared pref
}
Untuk Memeriksa apakah layanan saya berjalan atau tidak
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
Namun fungsi isMyServiceRunning() selalu menghasilkan false. artinya layanan terputus saat berpindah dari Aktivitas1 ke Aktivitas2
Adakah Solusi untuk mempertahankan koneksi perangkat yang lemah di seluruh aktivitas?