我有这样的服务:
<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是否还活着吗?
答案 0 :(得分:2)
您可以使用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.
}
}