47 votes

Comment désenregistrer BroadcastReceiver

Mon application utilise un BroadcastReceiver pour recevoir des sms de cette manière :

SmsBR.java

public class SmsBR extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdus = (Object[])bundle.get("pdus");
            final SmsMessage[] messages = new SmsMessage[pdus.length];

            for (int i = 0; i < pdus.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            }
            if (messages.length > 0)
                //doSomething();
            }
        }
    }
}

Manifeste.xml

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Activity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter> 
    </activity>

    <receiver android:name=".SmsBR">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
        </intent-filter>
    </receiver>
</application>    

De cette façon, SmsBR est toujours activé. Je veux l'enregistrer lorsqu'un service démarre ( onCreate() ) et le désenregistrer lorsque le service est détruit ( onDestroy() ). Comment puis-je faire cela ?

110voto

WindsurferOak Points 1841

Edit :

Pour une activité :

Afin d'enregistrer votre récepteur de radiodiffusion à partir de votre application, commencez par supprimer l'icône de l'application. <receiver> de votre fichier AndroidManifest.xml. Ensuite, appelez registerReceiver(BroadcastReceiver receiver, IntentFilter filter) dans votre onResume() . Utilisez unregisterReceiver(BroadcastReceiver receiver) dans votre onPause() pour désenregistrer le récepteur de diffusion.

Pour un service :

Retirez la balise du récepteur du fichier manifeste. Vous pouvez ensuite enregistrer votre récepteur de diffusion avec la même méthode dans le fichier manifeste. onCreate() et se désinscrire dans le onDestroy() .

EDIT : Exemple de code :

public class MyActivity extends Activity {
  private final BroadcastReceiver mybroadcast = new SmsBR();

  public void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(mybroadcast, filter);
  }

  public void onPause() {
    super.onPause();

    unregisterReceiver(mybroadcast);
  }
}

23voto

vivek Points 525

onDestroy() n'est pas garanti d'être appelé. Lorsque vous lancez Activity à partir de Activty, onPause() y onStop() appelée à la place de la méthode onDestroy() .

onDestroy() les appels lorsque vous appuyez sur le bouton retour ou l'appel finish() méthode.

Par conséquent, le récepteur de diffusion doit être enregistré dans onStart() o onResume() et désenregistrer le récepteur dans onPause() o onStop() .

Si vous désenregistrez le récepteur dans onDestroy() méthode, cela pourrait provoquer une fuite de mémoire dans l'application .

0voto

Maher Points 6

Retirez d'abord l'étiquette du récepteur du manifeste, puis : pour le service :

@Override
public void onCreate() {

    myReceiver = new SmsBR();
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.intent.action.SMS_RECEIVED");// add any actions you want
    registerReceiver(myReceiver , filter);

 }

@Override
public void onDestroy() {
    super.onDestroy();
    if (myReceiver != null)
        unregisterReceiver(myReceiver);
}

pour l'activité :

public class MyActivity extends Activity {
  private final BroadcastReceiver mybroadcast = new SmsBR();

  public void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(mybroadcast, filter);
  }

  public void onPause() {
    super.onPause();

    if (mybroadcast!= null)
       unregisterReceiver(mybroadcast);
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X