activity 崩溃时会发生什么?
What happen when the activity crash?
我有一个这样创建的服务:
<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 绑定到服务并设置监听器。当服务收到一条消息时,它只是触发侦听器
现在有个大问题:如果 activity 突然崩溃会怎样? 在那种情况下 mListener
会指向不存在的东西,不是吗?
如何在调用 mListener.onMessageReceived(remoteMessage)
之前检查绑定的 Activity 是否仍然存在?
您可以使用 WeakReference and 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.
}
}
我有一个这样创建的服务:
<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 绑定到服务并设置监听器。当服务收到一条消息时,它只是触发侦听器
现在有个大问题:如果 activity 突然崩溃会怎样? 在那种情况下 mListener
会指向不存在的东西,不是吗?
如何在调用 mListener.onMessageReceived(remoteMessage)
之前检查绑定的 Activity 是否仍然存在?
您可以使用 WeakReference and 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.
}
}