5

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

<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 绑定到 Service 并设置一个监听器。当服务接收到消息时,它只是触发侦听器

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

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

4

1 回答 1

2

您可以使用Wea ​​kReferenceDeadObjectException,因为您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.
    }
}
于 2017-04-21T23:59:35.947 回答