Ich muss im onCreate-Ereignis einer Aktivität einen benutzerdefinierten Broadcast-Empfänger erstellen, und natürlich muss ich die Registrierung des Broadcast-Empfängers im onDestroy-Ereignis der Aktivität aufheben
Aus Gründen der Klarheit ist dies ein Ausschnitt aus dem von mir verwendeten Code
public class AnActivity extends Activity {
private ResponseReceiver receiver;
public class ResponseReceiver extends BroadcastReceiver {
public static final String ACTION_RESP =
"mypackagename.intent.action.MESSAGE_PROCESSED";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Start a dialogue if message indicates successfully posted to server
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new ResponseReceiver();
registerReceiver(receiver, filter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
Ich habe gelesen, dass die Ereignisse onPause / onResume und onStart / onStop für die Aktivität auch den Rundfunkempfänger registrieren und die Registrierung aufheben sollten.
Ich möchte wirklich verstehen, was als beste Vorgehensweise dafür angesehen wird und warum.
android
broadcastreceiver
jamesc
quelle
quelle
onDestroy()
Aufrufen keine Ereignisse mehr vom Empfänger abgehört werden.Antworten:
Sie sollten Ihre Empfänger registrieren und die Registrierung aufheben
onStart()
undonStop()
.Der einzige Grund, warum eine Aktivität
BroadcastReceiver
s registrieren würde, besteht darin, die Ereignisse in irgendeiner Weise für die aktuelle Aktivität zu verwenden, um den Benutzer über ein Ereignis zu informieren. WennonStop()
aufgerufen wurde,Activity
steht das nicht mehr im Vordergrund und kann daher den Benutzer nicht aktualisieren.Wenn Sie Broadcast-Ereignisse im Hintergrund empfangen möchten, sollten Sie einen hier angegebenen Dienst in Betracht ziehen .
Wie Konstantin sagt,
onDestroy()
ist nicht garantiert, angerufen zu werden, und Sie könnten noch lange Sendungen empfangen, wenn dieActivity
nicht mehr geöffnet ist.quelle
Da
onDestroy()
es nicht garantiert ist, dass Sie angerufen werden, müssen SieonPause()
sich abmelden. Betrachten Sie den Lebenszyklus Ihres Rundfunkempfängers: Muss er nur dann aktiv sein, wenn Ihre Aktivität im Vordergrund steht? Dann benutzeonResume()
/onPause()
quelle
Die Android-Dokumentation schreibt keinen einzigen Ort zum Registrieren / Aufheben der Registrierung von Rundfunkempfängern vor, nennt jedoch sowohl
onStart()
/onStop()
als auchonResume()
/onPause()
als Möglichkeiten.Der größte Faktor bei dieser Entscheidung ist, wann Ihr Empfänger seine Arbeit erledigen muss. Dadurch wird festgelegt, wann die Registrierung erfolgen und wann die Registrierung aufgehoben werden soll.
Muss der Empfänger nur dann etwas gegen die Sendung unternehmen, wenn die Aktivität im Fokus steht? Wenn ja, können Sie es in
onPause()
/ registrieren / abmeldenonReceive()
. (Sie können auch eine längere Lebensdauer wieonStart()
/ verwendenonStop()
, aber dann sollten Sie während des Empfängers prüfen,onReceive()
ob die Aktivität im Fokus steht.)Muss der Empfänger etwas tun, wenn er sichtbar ist, auch wenn er keinen Fokus hat (z. B. wenn ein Dialogfeld angezeigt wird)? Wenn ja, verwenden Sie
onStart()
/onStop()
(oder eine längere Lebensdauer, aber auch hier sollte der EmpfängeronReceive()
prüfen, ob die Aktivität sichtbar ist).Muss der Empfänger über die Sendung Bescheid wissen, auch wenn die Aktivität nicht sichtbar ist? Zum Beispiel muss es nicht vergessen , dass etwas passiert ist, so dass , wenn die Aktivität wird sichtbar, kann es den resultierenden Zustand widerspiegelt? Dann müssen Sie
onCreate()
/ verwenden, um sichonDestroy()
zu registrieren / die Registrierung aufzuheben. (Beachten Sie, dass es andere Möglichkeiten gibt, diese Art von Funktionalität zu implementieren.)Wenn Sie sich registrieren
onStart()
, registrieren Sie sie nicht auchonResume()
, da dies überflüssig wäre: WirdonResume()
niemals aufgerufen, ohneonStart()
vorher angerufen zu werden.Denken Sie auch daran, dass es am besten ist , onPause () so hell wie möglich zu halten :
Es stimmt , dass
onDestroy()
wird nicht aufgerufen werden garantiert , wenn das System Ihren Prozess , um Speicherplatz zu sparen tötet. Wenn der Prozess jedoch abgebrochen wird, empfängt der Prozess ohnehin keine Sendungen. Ist es in diesem Fall wirklich notwendig, die Registrierung von Rundfunkempfängern aufzuheben?quelle
If you register in onStart(), don't also register them in onPause(), because that would be redundant: onPause() is never called without onStart() being called first.
ist nur unlogisch und verwirrend, insbesondere wenn die akzeptierte Antwort vollkommen korrekt ist.Android kann Ihre Anwendung durch Weglassen der
onStop()
Methode beenden . Der beste Weg, um diese Situation zu lösen, besteht darin, sichBroadcastReceiver
in deronResume()
Methode zu registrieren und die Registrierung in aufzuhebenonPause()
.quelle
onStop()
aswellSie sollten Ihre Sendung mit den Methoden onResume () und onPause () registrieren und die Registrierung aufheben.
Wenn Sie sich in onStart () registrieren und die Registrierung in onStop () aufheben. Dieses Mal erhalten Sie folgendes Problem.
quelle