5

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?

Antwort

2

Sie können WeakReference und DeadObjectException verwenden, da Ihre Activity scheint in einer anderen App zu sein. Dadurch können Sie wissen, ob der Activity Müll gesammelt wurde, weil Ihre Referenz null wird und Sie nicht leak.

private WeakReference<MyListener> mListener; 

So speichern Sie die WeakReference.

public void setListener(MyListener listener) 
{ 
    mListener = new WeakReference<MyListener>(listener); 
} 

So verwenden Sie es.

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) 
{ 
    MyListener listener = mListener.get(); 

    if(listener != null) 
    { 
     try 
     { 
      listener.onMessageReceived(remoteMessage); 
     } 
     catch(DeadObjectException exception) 
     { 

     } 
    } 
    else 
    { 
     // Activity was destroyed. 
    } 
} 
+0

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? –

+0

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. –

+0

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 ... –

Verwandte Themen