当活动崩溃时会发生啥?

Posted

技术标签:

【中文标题】当活动崩溃时会发生啥?【英文标题】: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是否还活着?

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

以上是关于当活动崩溃时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

当 docker 容器崩溃时数据会发生啥

当 RabbitMQ 消费者崩溃时,获取的消息会发生啥?

调用具有条件变量等待的线程对象的析构函数时会发生啥?

将项目更新到 android 10 后 onCreate 活动崩溃

为啥在另一个线程上发生 dealloc 时尝试创建对 self 的弱引用时会崩溃?

Crashlytics iOS - 第 0 行崩溃 - Swift 来源