当活动崩溃时会发生什么?

5 android ipc android-service android-service-binding bindservice

我有一个像这样的服务:

<service
    android:name="com.myFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)

然后我实现onBind这样:

  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);  
  }
Run Code Online (Sandbox Code Playgroud)

这很简单:Activity绑定到Service并设置一个监听器.当服务收到消息时,它只是触发监听器

现在最大的问题是:如果活动突然崩溃会发生什么? 在那种情况下mListener会指出一些不存在的东西,不是吗?

如何,在调用之前mListener.onMessageReceived(remoteMessage),我可以检查绑定的Activity是否还活着?

New*_*abs 2

您可以使用 Wea ​​kReferenceDeadObjectException,因为您Activity似乎在另一个应用程序中。这将使您知道是否Activity已被垃圾收集,因为您的引用将变为null并且不会泄漏。

private WeakReference<MyListener> mListener;
Run Code Online (Sandbox Code Playgroud)

这就是您存储WeakReference.

public void setListener(MyListener listener) 
{
   mListener = new WeakReference<MyListener>(listener);
}  
Run Code Online (Sandbox Code Playgroud)

这就是你如何使用它。

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

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

        }
    }
    else
    {
        // Activity was destroyed.
    }
}
Run Code Online (Sandbox Code Playgroud)