0

私の主な活動では、チェックボックスをオンにすると、Bluetoothデバイスへの変更、つまりデバイスに接続されたBluetoothの変更を聴くための受信機が登録されます。 電話が予め選択されたブルートゥースデバイスに接続されたときに、そのサービスが呼び出された後に受信中からサービスを開始したい。 問題は、主なアクティビティの「オン」チェックボックスをクリックしてレシーバを登録したときに、ユーザーが戻るボタンをクリックしてアプリを終了すると、アプリ/アンドロイドのライフサイクルがonDestroyを呼び出してエラーが発生する漏れた受信機と言っている。ユーザーがメインボタンをクリックしてメインアクティビティを終了しても、受信者を登録して登録し続けるにはどうすればいいですか?受信を動的に登録するサービスを開始する受信者

アプリには主なアクティビティが1つしかありません。 ユーザがチェックボックスのチェックを外すと、レシーバの登録が解除されます。

addDrawerItems方法

final IntentFilter blueToothFilter = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED); 
    blueToothFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); 

if (ctv.isChecked()) { 
    if (!isblueToothRegistered) { 
     registerReceiver(mReceiver, blueToothFilter); 
     isblueToothRegistered = true; 
     Toast.makeText(getApplicationContext(),"Bluetooth ON",Toast.LENGTH_LONG).show(); 
    } 
} else { 
    if (isblueToothRegistered) { 
     unregisterReceiver(mReceiver); 
     isblueToothRegistered = false; 
     Toast.makeText(getApplicationContext(),"Bluetooth OFF",Toast.LENGTH_LONG).show(); 
    } 
} 

放送受信機のユーザが、その唯一の仕事は、受信機を登録することである 別のサービスが開始されるチェックボックスをチェックし、多分

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 

    private Boolean bluetoothStart = false; 


    @Override 
    public void onReceive(Context context, Intent intent) { 



     //Toast.makeText(context, "Receieved", Toast.LENGTH_LONG).show(); 
     String action = intent.getAction(); 

     final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
     Intent serviceIntent = new Intent(context, CallDetectService.class); 

     if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { 
      //Toast.makeText(context, "Bluetooth Connected", Toast.LENGTH_LONG).show(); 


      if (device.getName().equals(mPairedBluetoothDevice)) { 
       bluetoothStart = true; 
       serviceIntent.putExtra("btConnected",bluetoothStart); 
       startService(serviceIntent); 

       showStatusBarIcon(true); 

       detectEnabled = true; 
       SharedPreferences sharedPreferences3 = getSharedPreferences("driveSafeMode", Context.MODE_PRIVATE); 

       SharedPreferences.Editor editor = sharedPreferences3.edit(); 
       editor.putBoolean("mode", detectEnabled); 
       editor.apply(); 
       toggleUI(); 


       // Toast.makeText(context, mPairedBluetoothDevice, Toast.LENGTH_LONG).show(); 
      } 
     } 

     else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)){ 
      stopService(serviceIntent); 
      showStatusBarIcon(false); 
      detectEnabled = false; 

      SharedPreferences sharedPreferences3 = getSharedPreferences("driveSafeMode", Context.MODE_PRIVATE); 

      SharedPreferences.Editor editor = sharedPreferences3.edit(); 
      editor.putBoolean("mode", detectEnabled); 
      editor.apply(); 

      toggleUI(); 

     } 
    } 
}; 

onStartCommandそしてunRegisterReceiver onDestroy。その場合、サービスは接続されるべきブルートゥースデバイスを聞いて、数日間実行されるかもしれません。それは大丈夫だろうか?助けていただきありがとうございます。

答えて

0

manifestreceiverを登録してください。コードを有効/無効にする場合にのみ使用してください。

+0

メインアクティビティのチェックボックスをオンにして、レシーバをマニフェストに登録し、ボックスのチェックを外してマニフェストのレシーバを登録解除することができますか?マニフェストに登録されているレシーバは常にlisten/onに登録されていると思った –

+0

はい、これらのリスナーは常に登録されています。しかし、彼らは「無効にする」ことができます。 – F43nd1r

+0

ok音が良い!私が探しているのは、電話機がBluetoothに接続されている場合に、自動的にアプリを起動させたいかどうか、ユーザーに選択肢を与えることです。チェックボックスをオンまたはオフにします。言ってることわかりますか? –

関連する問題