Ich habe einen Dienst wie folgt erstellt:Was passiert, wenn die Aktivität abstürzt?
<service
android:name="com.myFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
Dann implementiere ich das onBind
wie folgt aus:
private final IBinder mBinder = new LocalBinder();
private myListener mListener;
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
public void setListener(myListener listener) {
mListener = listener;
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (mListener != null) mListener.onMessageReceived(remoteMessage);
}
Es ist ganz einfach: die Aktivität an den Service bindet und einen Hörer einrichtet. Wenn der Dienst eine Nachricht erhält, feuert er einfach den Listener
Nun die große Frage: was passiert, wenn die Aktivität plötzlich abstürzt? In diesem Fall wird mListener
auf etwas nicht existent zeigen, nicht?
Wie kann ich vor dem Aufruf mListener.onMessageReceived(remoteMessage)
prüfen, ob die gebundene Aktivität noch aktiv ist?
hmm was ist, wenn der App-Absturz zwischen MyListener listener = mlistener.get(); und listener.onMessageReceived (remoteMessage); ? auch wie ich verstehe schwache referenz werden gelöscht, wenn der GC lief, und das ist nicht unbedingt zu der zeit der app crash nein? –
Sobald Sie die "Listener" -Referenz haben, kann es nicht GC sein. Wenn die App abstürzt, erhalten alle GC, aber Ja 'WeakReference' werden auf GC gelöscht. –
ja, aber es ist nutzlos, einen Verweis darauf zu haben, wenn die App abgestürzt ist, weil höchstwahrscheinlich der Code innerhalb des Listeners abstürzt und sich auch unerwartet verhält ... –