Android Messenger使用及分析

Messenger是基於AIDL實現的輕量級IPC方案。

1.使用

1.1服務端

接受信息的服務端需要實現一個Handler用於處理到的信息

    private static class MessengerHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_FROM_CLIENT:
                    Log.e(TAG, msg.getData().getString("msg"));;
                default:
                    break;
            }
        }
    }

然後用Messenger將Handler進行封裝

  private final Messenger messenger = new Messenger(new MessengerHandler());

再通過onbinder函數返回messenger成員變量IMessenger的Binder,IMessenger實際上就是AIDL文件生成的接口,而Messenger對AIDL進行了封裝。

    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }

1.2客戶端

通過ServiceConnection類的onServiceConnected獲取到Binder,從而獲取到服務端的Messenger代理類,調用send函數發送Message。所以Messenger能發送的信息只有Message能攜帶的信息。

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            serverMessenger = new Messenger(service);
            Message message = Message.obtain(null, MessengerService.MSG_FROM_CLIENT);
            Bundle data = new Bundle();
            data.putString("msg", "I am from the client.");
            message.setData(data);
            try{
                serverMessenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

1.3服務端返回客戶端信息

同樣是基於Messenger,客戶端同需要學要實現一個帶Handler的Messenger用於處理服務端返回的信息,而將客戶端的Messenger傳遞給服務端是通過 Message的replyTo字段實現的,public Messenger replyTo;

  • 客戶端代碼
public class MessengerClient extends AppCompatActivity {

    private static final String TAG = "MessengerClient";
    public static final int FROM_SERVER = 1;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case FROM_SERVER:
                    Log.e(TAG, msg.getData().getString("reply"));
                    break;
                default:
                    break;
            }
        }
    };

    private Messenger clientMessenger = new Messenger(handler);

    private Messenger serverMessenger;

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            serverMessenger = new Messenger(service);
            Message message = Message.obtain(null, MessengerService.MSG_FROM_CLIENT);
            Bundle data = new Bundle();
            data.putString("msg", "I am from the client.");
            message.setData(data);
            message.replyTo = clientMessenger;
            try{
                serverMessenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this, MessengerService.class);
        bindService(intent, connection, BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        unbindService(connection);
        super.onDestroy();
    }
}

  • 服務端代碼
package com.example.zhouk.testproject.aidl;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;

public class MessengerService extends Service {
    private static final String TAG = "MessengerService";
    public static final int MSG_FROM_CLIENT = 112;

    private static class MessengerHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_FROM_CLIENT:
                    Log.e(TAG, msg.getData().getString("msg"));
                    Messenger clientMessenger = msg.replyTo;
                    Message replyMessage = Message.obtain(null, MessengerClient.FROM_SERVER);
                    Bundle data = new Bundle();
                    data.putString("reply", "I am from the server");
                    replyMessage.setData(data);
                    try {
                        clientMessenger.send(replyMessage);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    break;
            }
        }
    }

    private final Messenger messenger = new Messenger(new MessengerHandler());

    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章