5 android ipc android-service android-service-binding bindservice
我有一个像这样的服务:
<service
android:name="com.myFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
然后我实现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);
}
Run Code Online (Sandbox Code Playgroud)
这很简单:Activity绑定到Service并设置一个监听器.当服务收到消息时,它只是触发监听器
现在最大的问题是:如果活动突然崩溃会发生什么? 在那种情况下mListener
会指出一些不存在的东西,不是吗?
如何,在调用之前mListener.onMessageReceived(remoteMessage)
,我可以检查绑定的Activity是否还活着?
您可以使用 Wea kReference和DeadObjectException,因为您Activity
似乎在另一个应用程序中。这将使您知道是否Activity
已被垃圾收集,因为您的引用将变为null
并且不会泄漏。
private WeakReference<MyListener> mListener;
Run Code Online (Sandbox Code Playgroud)
这就是您存储WeakReference
.
public void setListener(MyListener listener)
{
mListener = new WeakReference<MyListener>(listener);
}
Run Code Online (Sandbox Code Playgroud)
这就是你如何使用它。
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
{
MyListener listener = mListener.get();
if(listener != null)
{
try
{
listener.onMessageReceived(remoteMessage);
}
catch(DeadObjectException exception)
{
}
}
else
{
// Activity was destroyed.
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
194 次 |
最近记录: |