0

Я хочу отменить регистрацию трансляции, когда переключатель отключен. Я попытался это, но он не работает:BroadcastReceiver unregister error

Switch BTswitch = (Switch)findViewById(R.id.BTswitch); 
    BTswitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked){ 
        registerReceiver(new mReceiver(), new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); 
       } 
      else { 
        PackageManager pm = getPackageManager(); 
        ComponentName component = new ComponentName(MainActivity.this, mReceiver.class); 
        pm.setComponentEnabledSetting(component , PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP); 
       } 
     } 
    }); 

Я также попытался:

unregisterReceiver(mReceiver); 

Вот мой андроид манифеста:

<receiver 
     android:name=".mReceiver" 
     android:enabled="false"> 
     <intent-filter> 
      <action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 

Это файл mReceiver.java :

public class mReceiver extends BroadcastReceiver { 

private DevicePolicyManager mDevicePolicyManager; 
private ComponentName mComponentName; 


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

Как отменить регистрацию. Этот код не отменяет регистрацию широковещательной рассылки. Он всегда работает.

+0

вы пытались использовать [unregisterReceiver] (https://developer.android.com/reference/android/content/Context.html#unregisterReceiver (android.content.BroadcastReceiver)) для отмены регистрации? – k3b

+0

да, я пробовал: unregisterReceiver (mReceiver); –

ответ

0

На самом деле он продолжает создавать несколько экземпляров (mReceiver экземпляров) всякий раз, когда вы коммутационные:

registerReceiver(new mReceiver(), new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); 
       } 

Если вы можете себе позволить, вы можете изменить ваши коды просто использовать один экземпляр mReceiver

final Register receiver = new mReceiver(); 

@Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked){ 
        registerReceiver(receiver , new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); 
       } 

, так что, когда вы отмените регистрацию получателя, вы отмените регистрацию того же mReceiver.

unregisterReceiver (receiver); 
+0

Большое спасибо. Чтобы отменить регистрацию, следует использовать PackageManager pm = getPackageManager(); ComponentName component = new ComponentName (MainActivity.this, mReceiver.class); pm.setComponentEnabledSetting (компонент, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); или unregisterReceiver (mReceiver); –

+0

Нет, просто * unregisterReceiver (приемник) *, он работает большую часть времени –