2012-06-18 80 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()方法中更新參考,甚至每一次您收到一條消息。

相關問題