Android中跨進程通訊方式之使用Messenger

來源:互聯網
上載者:User

標籤:

服務端MessengerService的process屬性指定它的進程跟MainActivity不在一個進程

        <service            android:name="com.example.activity.MessengerService"            android:process="com.example.activity.remote" >        </service>

在MessengerService建立一個Messenger,以它底層的binder作為綁定服務返回的IBinder對象。

    private final Messenger messenger = new Messenger(new messengerHandler());    @Override    public IBinder onBind(Intent intent) {        return messenger.getBinder();    }

messengerHandler用於處理用戶端向服務端通過Messenger發的Message。

private class messengerHandler extends Handler{        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            System.out.println(msg.getData().getString("msg"));        }    }

用戶端MainActivity中綁定服務。

                Intent intent = new Intent();                intent.setClass(MainActivity.this, MessengerService.class);                bindService(intent, conn, Context.BIND_AUTO_CREATE);

綁定服務需要ServiceConnection,以綁定Service返回的IBinder對象建立Messenger ,將用戶端要發送的資訊發個服務端。

private ServiceConnection conn = new ServiceConnection() {        @Override        public void onServiceDisconnected(ComponentName name) {        }        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            Messenger messenger = new Messenger(service);            Message msg = Message.obtain();            Bundle data = new Bundle();            data.putString("msg", "hello!!!");            msg.setData(data);            try {                messenger.send(msg);            } catch (RemoteException e) {                e.printStackTrace();            }        }    };

此時,服務端便可通過messengerHandler接受到用戶端發送的訊息,至此完成進程間的通訊。
當然,服務端也可以回複訊息給用戶端。
可在用戶端也建立一個Messenger,通過hanlder來處理服務端發送的訊息。

private Messenger mainMessenger = new Messenger(new MessengerHandler());private class MessengerHandler extends Handler{        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            System.out.println(msg.getData().getString("reply"));        }    }

當然需要把用戶端的mainMessenger 傳遞給服務端,服務端通過mainMessenger 發送訊息給用戶端。這裡使用Message的replyTo屬性傳遞。

msg.replyTo = mainMessenger;

那麼服務端便可通過用戶端傳遞過來的Messenger給用戶端返回訊息了。

            Messenger client = msg.replyTo;            Bundle bundle = new Bundle();            Message reply = Message.obtain();            bundle.putString("reply", "hello yeah!");            reply.setData(bundle);            try {                client.send(reply);            } catch (RemoteException e) {                e.printStackTrace();            }

這時用戶端便可通過mainMessenger擷取服務端發回的訊息。

使用Messenger通訊不能很好的處理高並發,因為它的訊息是一條一條處理的。它通過Message傳輸訊息,所以只支援Bundle資料類型。在低並發的即時通訊中,可以使用這種方式。

Android中跨進程通訊方式之使用Messenger

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.