当活动崩溃时会发生啥?
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
何时死亡。我更新了上面的答案。以上是关于当活动崩溃时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
将项目更新到 android 10 后 onCreate 活动崩溃