activity 崩溃时会发生什么?

What happen when the activity crash?

我有一个这样创建的服务:

<service
    android:name="com.myFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

然后我这样实现 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);  
  }

非常简单:Activity 绑定到服务并设置监听器。当服务收到一条消息时,它只是触发侦听器

现在有个大问题:如果 activity 突然崩溃会怎样? 在那种情况下 mListener 会指向不存在的东西,不是吗?

如何在调用 mListener.onMessageReceived(remoteMessage) 之前检查绑定的 Activity 是否仍然存在?

您可以使用 WeakReference and DeadObjectException,因为您的 Activity 似乎在另一个应用程序中。这将使您知道 Activity 是否被垃圾收集,因为您的引用将变为 null 而您不会泄漏。

private WeakReference<MyListener> mListener;

这就是您存储 WeakReference 的方式。

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

这就是您的使用方式。

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

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

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