2013-01-16 9 views

risposta

41

È necessario annullare la registrazione i ricevitori sulla fermata della vostra attività:

@Override 
protected void onStop() 
{ 
    unregisterReceiver(yourReceiver); 
    super.onStop(); 
} 
+1

L'annullamento della registrazione del ricevitore in onStop() è la risposta corretta. Non devi annullare la registrazione solo dopo aver ricevuto e non è necessario farlo in onPause() o – portfoliobuilder

3

è possibile annullare la registrazione non appena si riceve il broadcastreceiver

@Override 
public void onReceive(Context context, Intent intent) { 
getActivity().unregisterReceiver(this); 
+3

Non annullare la registrazione solo dopo aver ricevuto una progettazione errata a meno che non abbiamo tale requisito –

+1

Sì, non sono sicuro del motivo per cui si vorrebbe farlo a meno che non sia uno il tempo riceve In genere ho impostato BroadcastReceivers fino a messaggi continui – MobileMon

+1

Nel mio caso perché lo sto utilizzando in downloadmanager. Quindi, quando il download del file è finito, ho bisogno di essere informato. E se l'utente inizia a scaricare un altro file, viene registrato un altro destinatario di trasmissione. In questo modo se l'utente inizia a scaricare più file, ho un ricevitore di trasmissione diverso per ogni gestore di download. –

43

Non fare affidamento su onStop() , because:

Si noti che questo metodo potrebbe non mai essere chiamato, in situazioni di memoria insufficiente in cui il sistema non dispone di memoria sufficiente per mantenere processo in esecuzione della vostra attività dopo il suo metodo onPause() viene chiamato

più sul ciclo di vita di attività here.

la registrazione del proprio ricevitore onPause():

@Override 
protected void onPause() { 
    super.onPause(); 

    unregisterReceiver(yourReceiver); 
} 
+0

Va bene solo annullare la registrazione in onDestroy? – MobileMon

+4

@MobileMon, utilizzare onResume() e onPause() per registrare/annullare la registrazione dei ricevitori. onDestroy() potrebbe non essere sempre chiamato, come onStop(). Vedi una grande spiegazione qui da SnowyTracks: http: // StackOverflow.it/questions/7887169/android-when-to-register-unregister-broadcast-receiver-created-in-an-activity – Melquiades

+0

Inoltre, onPause non significa che l'attività non verrà mai più riavviata. Non dimenticare di registrare nuovamente il tuo ricevitore su onResume se hai ancora bisogno di ricevere trasmissioni poiché l'attività può essere ripresa prima di essere distrutta. –

2

la registrazione del proprio ricevitore onStop() è la risposta valida. Non chiamarlo con il metodo onPause().

@Override 
protected void onStop() 
{ 
    unregisterReceiver(yourReceiverName); 
    super.onStop(); 
} 
1

solo per aggiungere alle risposte di cui sopra, se si registra un ricevitore in su onCreate, dovrebbe essere registrato in OnDestroy. se si registra un ricevitore su onResume, è necessario annullarne la registrazione in onPause.

essere consapevoli di dove si registra e annullare la registrazione del ricevitore, ad esempio, se si registra un ricevitore a onCreate (bundle) utilizzando contesto della propria attività, si dovrebbe annullare la registrazione in OnDestroy() per evitare perdite ricevitore fuori il contesto di attività. Se si registra un ricevitore in onResume(), è necessario annullarne la registrazione in onPause() per evitare di registrarlo più volte (se non si desidera ricevere trasmissioni in pausa e questo può ridurre il sovraccarico del sistema non necessario). Non annullare la registrazione in onSaveInstanceState (Bundle), perché non viene chiamato se l'utente si sposta indietro nello stack cronologia.

Source

Problemi correlati