【问题标题】:What happen when the activity crash?当活动崩溃时会发生什么?
【发布时间】:2017-04-21 23:36:43
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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.
        }
    }
    

    【讨论】:

    • hmm 如果应用程序在 MyListener listener = mListener.get(); 之间崩溃怎么办?和 listener.onMessageReceived(remoteMessage); ?同样据我所知,弱引用在 GC 运行时被删除,这不一定是在应用程序崩溃时没有?
    • 一旦有了listener 引用,它就不能是GC。如果应用程序崩溃,那么所有应用程序都会获得 GC,但是WeakReference 会在 GC 上被删除。
    • 是的,但是如果应用程序崩溃了,引用它是没有用的,因为很可能监听器内部的代码也会崩溃,表现出意外......
    • @john 因为您的Activity 似乎在另一个应用程序中,您可以使用DeadObjectException 知道Activity 何时死亡。我更新了上面的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多