活动崩溃后会发生什么?

时间:2017-04-21 23:36:44

标签: android android-service ipc android-service-binding bindservice

我有这样的服务:

<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是否还活着吗?

1 个答案:

答案 0 :(得分:2)

您可以使用WeakReferenceDeadObjectException,因为您的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.
    }
}