簡單的使用Messenger跨進程通信

  • 正常的使用Service,我們都是在ServiceConnection的回調中強轉成自己的service,
    • 下面這種是沒有在xml中開啟進程的,這樣使用沒有問題。
  private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder iBinder) {
            ProcessService processService  = (ProcessService) iBinder;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

  • 但是如果在xml中添加android:process="xxxx" 后 ,上面的方法就不可以用了!

  • 那就需要使用Messenger,而且Messenger在開進程或者不開進程中都可以使用,所以建議使用Messenger進行活動與service間的通信,而且使用起來也簡單

  • 首先需要在service中創建對象,需要一個Handler來進行鏈接

    public static final int MSG_1 = 1;
    public static final int MSG_2 = 2;
    public static final int MSG_3 = 3;

    private Messenger mMessenger = new Messenger(mHandler);

    private static Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {

            switch (msg.arg1) {
                case MSG_1:
                    String msg1 = msg.getData().getString("msg");
                    L.d( " msg 1 " + msg1);
                    break;
                case MSG_2:
                    L.d( " msg 2 ");
                    break;
                case MSG_3:
                    L.d( " msg 3 ");
                    break;
                default:
                    break;
            }

        }
    };
//在onBind的回調中寫上Messenger的binder
 @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mMessenger.getBinder();
    }
//好了,service中的代碼這樣就算完成了


  • 然后就是activity中的代碼
//首先綁定服務
  bindService(new Intent(this , ProcessService.class) , mConnection , Context.BIND_AUTO_CREATE );
//然后就是在ServiceConnection的回調中得到Messenger的對象

  private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder iBinder) {

            mMessenger = new Messenger(iBinder);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
//得到Messenger的對象就可以使用它進行發送信息了,它需要一個message對象。
 public void btnOnClick(View view){
        Message message = new Message();
        message.arg1 = ProcessService.MSG_1;
        message.getData().putString("msg" , "this is msg");
        try {
            mMessenger.send(message);
        } catch (RemoteException e) {
            e.printStackTrace();
        }

    }

  • 這樣不管xml中開了進程或者沒有開,都可以用上面的方法進行與服務之間的簡單通信
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容