2011-06-30 9 views
37

Wiem o używaniu registerReceiver i unregisterReceiver w kodzie Javy do czynienia z odbiorników, ale powiedzmy, że mam następujących w moim manifeście:Android - jak wyrejestrować odbiornik utworzony w manifeście?

<receiver android:name=".headsetHook"> 
     <intent-filter android:priority="99999999999"> 
      <action android:name="android.intent.action.ACTION_HEADSET_PLUG" /> 
     </intent-filter> 
    </receiver> 

Czy istnieje sposób mogę wyrejestrować to gdzieś w kodzie Java? Czy mogę nadać mu atrybut id lub coś takiego, a następnie zdobyć i wyrejestrować? Pytam, ponieważ chcę, aby moja aplikacja robiła coś tylko wtedy, gdy po raz pierwszy zdarzy się ta akcja, a następnie wyrejestruj ją i ponownie zarejestruj później w Javie.

Mam nadzieję, że wyraziłem się jasno, dziękuję za pomoc.

Odpowiedz

78

Możesz użyć PackageManager, aby włączyć/wyłączyć BroadcastReceiver w zadeklarowanym w Manifeście. Broadcast Receiver zostanie uruchomiony tylko wtedy, gdy jest włączony.

Użyj tego, aby utworzyć komponent

ComponentName component = new ComponentName(context, MyReceiver.class); 

Sprawdź, czy składnik ten jest włączony, czy wyłączony

int status = context.getPackageManager().getComponentEnabledSetting(component); 
if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { 
    Log.d("receiver is enabled"); 
} else if(status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { 
    Log.d("receiver is disabled"); 
} 

Włącz/Wyłącz składnik (Broadcast Receiver w Twoim przypadku)

//Disable 
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP); 
//Enable 
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP); 
+1

o cholera, jesteś szefem. Pozwól mi to wypróbować, wygląda obiecująco. – JDS

+3

Uwaga: możesz również uzyskać status COMPONENT_ENABLED_STATE_DEFAULT –

+0

@Varun +1 Świetna odpowiedź .. Praca Nice .. – Venky

0

Na podstawie odpowiedzi Varuna stworzyłem tę metodę użytkową

private void unregisterReceiverFromManifest(Class<? extends BroadcastReceiver> clazz, final Context context) { 
    final ComponentName component = new ComponentName(context, clazz); 
    final int status = context.getPackageManager().getComponentEnabledSetting(component); 
    if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { 
     context.getPackageManager() 
       .setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
        PackageManager.DONT_KILL_APP); 
     } 
    } 
Powiązane problemy