web-dev-qa-db-fra.com

Comment annuler l'enregistrement de BroadcastReceiver

Mon application utilise un BroadcastReceiver pour recevoir des sms de cette façon:

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();
            }
        }
    }
}

Manifest.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 quand un service démarre (onCreate()) et le désenregistrer quand le service est détruit (onDestroy()). Comment puis-je faire ceci?

39
supergiox

Modifier:

Pour une activité:

Pour enregistrer votre récepteur de radiodiffusion à partir de votre application, commencez par supprimer la balise <receiver> de votre fichier AndroidManifest.xml. Ensuite, appelez registerReceiver(BroadcastReceiver receiver, IntentFilter filter) dans votre onResume(). Utilisez unregisterReceiver(BroadcastReceiver receiver) dans votre onPause() pour annuler l’enregistrement du récepteur de radiodiffusion.

Pour un service:

Supprimez la balise du destinataire du fichier manifeste. Vous pouvez ensuite enregistrer votre récepteur de radiodiffusion avec la même méthode dans la onCreate() et annuler l’inscription dans la 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);
  }
}
93
WindsurferOak

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

onDestroy() appelle lorsque vous appuyez sur le bouton précédent ou appelez la méthode finish().

Par conséquent, le récepteur de radiodiffusion doit être enregistré dans onRestart() ou onResume() et se désinscrire du récepteur dans onPause() ou onStop()

Si vous annulez l'enregistrement du récepteur dans la méthode onDestroy(),peut provoquer une fuite de mémoire dans App.

16
vivek

Commencez par supprimer la balise du destinataire du manifeste, 

@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);
  }
}
0
Maher