Bagaimana cara membuat koneksi BLE yang terhubung menggunakan layanan untuk digunakan di seluruh aktivitas tanpa menghentikan layanan atau memutus koneksi?

Saya memiliki 3 komponen.

  1. Aktivitas1 memiliki tombol untuk menghubungkan dan memutuskan Koneksi BLE

  2. Aktivitas2 Perlu Mendapatkan data dari Perangkat BLE.

  3. 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?


person Dinesh Ravi    schedule 07.11.2015    source sumber


Jawaban (1)


Buat LocalBinder (memperluas Binder) di kelas Layanan Anda. Dari Aktivitas #1, Anda dapat memulai layanan dan juga menggunakan bindservice untuk mengakses objek binder dan memanggil unbindservice untuk memutuskan sambungan dari layanan. Dari Aktivitas #2, Anda cukup memanggil bindservice lagi untuk mengakses objek binder karena layanan masih berjalan. Dengan cara ini Anda dapat menjaga layanan selalu berjalan dan mengakses objek bluetooth yang terhubung. Lihat contoh dari tautan di bawah ini.

contoh layanan terikat

person siva    schedule 07.11.2015