2012-06-18 50 views
0

我目前正在使用我的应用使用的插件与外部服务进行通信。如何使用Handler与绑定服务进行通信?

绑定服务最终启动一个活动,然后通知主应用程序该活动已完成。

问题是,本地广播通知服务。我已将Messenger msg.replyTo存储到一个变量中,因此我可以在处理程序完成后访问它,但服务仍处于绑定状态。

它确实有效,但我想完全确定没有NullPointer可能,所以我不太喜欢这种方法。

有没有更好的方式与Binder进行通信,而不是将Messenger存储在变量中?

这里是更好地了解一些代码:

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      try { 
       if (intent.getAction().equals("activity_closed") && mReplyMessenger != null) { 

       mReplyMessenger.send(Message.obtain(null, MSG_RESULT_ACTIVITY_FINISHED)); 

      } 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
}; 



class IncomingHandler extends Handler { 
    @Override 
    public void handleMessage(Message msg) { 
     mReplyMessenger = null; 
     try { 
      switch (msg.what) { 
      case MSG_START_ACTIVITY: { 
       mReplyMessenger = msg.replyTo; 

[...] 

       BridgeBinder.this.startActivity(i); 
       break; 
      } 
[...] 

      default: 
       super.handleMessage(msg); 
      } 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

final Messenger mMessenger = new Messenger(new IncomingHandler()); 

@Override 
public IBinder onBind(Intent arg0) { 
    return mMessenger.getBinder(); 
} 
+0

AsyncTask如何解决这个问题? – Force

+0

请在发布随机评论之前阅读该问题。它是关于绑定服务的,处理程序是主应用程序和外部服务之间的IPC。 – Force

回答

0

我实现双向的使者一样。我真的没有看到你的Handler获得了一个陈旧的参考(因此是一个NPE)到你的Activity,但是如果你想要格外谨慎,你可以尝试每次在你的onResume()方法中更新参考,甚至每一次您收到一条消息。

相关问题