Android开发不可避免要跨进程做数据交换,messenger便是一种较为方便的方式。

1、client 客户端代码

package com.snail.test.aidl.client;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Messenger;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class MainActivity extends Activity {

	private static final String TAG = "MainActivity";
	private static final int MSG_READ = 0x110;
	private static final int MSG_WRITE = 0x111;

	private Button mBtnAdd;
	private LinearLayout mLyContainer;
	// 显示连接状态
	private TextView mTvState;

	private Messenger mService;
	private boolean isConn;

	private Messenger mMessenger = new Messenger(new Handler() {
		@Override
		public void handleMessage(Message msgFromServer) {
			switch (msgFromServer.what) {
			case MSG_READ:
			    Log.e("cy", "test...:"+msgFromServer.arg1);
			    
            	Bundle b = msgFromServer.getData();
            	//String age = b.getString("text1");
            	
            	byte[] dataTest = b.getByteArray("dataTest");
			    
			    TextView tv = (TextView) mLyContainer.findViewById(msgFromServer.arg1);
			    //String a = String.valueOf(msgFromServer.arg1);
                tv.setText("Data: " + dataTest[0] + dataTest[1] + dataTest[2] + dataTest[3]);
           
                break;
			}
			super.handleMessage(msgFromServer);
		}
	});
	private ServiceConnection mConn = new ServiceConnection() {
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mService = new Messenger(service);
			isConn = true;
			mTvState.setText("connected!");
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			mService = null;
			isConn = false;
			mTvState.setText("disconnected!");
		}
	};

	private int mA;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		// 开始绑定服务
		bindServiceInvoked();

		mTvState = (TextView) findViewById(R.id.id_tv_callback);
		mBtnAdd = (Button) findViewById(R.id.id_btn_add);
		mLyContainer = (LinearLayout) findViewById(R.id.id_ll_container);

		mBtnAdd.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				try {
					
					//标识tv id,用于显示返回值
					int a = mA++;

					//创建一个tv,添加到LinearLayout中
                    TextView tv = new TextView(MainActivity.this);
                    tv.setText("test data");
                    tv.setId(a);
                    mLyContainer.addView(tv);
					
					Message msg = new Message();
					msg.what = MSG_READ;
					Bundle bundle = new Bundle();
					bundle.putString("text1", "消息回传: "); // 往Bundle中存放数据
					msg.setData(bundle);// msg利用Bundle传递数据
					msg.replyTo = mMessenger;
					msg.arg1 = a; 
					if (isConn) {
						// 往服务端发送消息
						mService.send(msg);
					}
				} catch (RemoteException e) {
					e.printStackTrace();
				}
			}
		});

	}

	private void bindServiceInvoked() {
		Intent intent = new Intent();
		intent.setAction("com.sodo.aidl.data");
		bindService(intent, mConn, Context.BIND_AUTO_CREATE);
		Log.e(TAG, "bindService invoked !");
	}

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

2、service 服务端代码

package com.example.messengerservice;
 
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
 
import com.alibaba.fastjson.JSON;
 
public class MessengerService extends Service{
    private static final String TAG = "MessengerService";
    private static final int MSG_READ = 0x110;
    
    private HandlerThread mHandlerThread;
    
    private Handler mHandler;
    
    private Messenger htMessenger;
 
    @Override
    public IBinder onBind(Intent arg0) {
        return htMessenger.getBinder();
    }
 
    @Override
    public void onCreate() {
        super.onCreate();

        mHandlerThread = new HandlerThread("work-thread");
        mHandlerThread.start();

        // mHandler 运行在 mHandlerThread 线程中
        mHandler = new Handler(mHandlerThread.getLooper()){
            @Override
            public void handleMessage(Message msgfromClient) {
                if(msgfromClient.what != MSG_READ){
                    return;
                }
                sendMsgToClient(msgfromClient);
            }
        };

        htMessenger = new Messenger(mHandler);
    }
 
    private void sendMsgToClient(Message msgfromClient) {
        Message msg = new Message();
        Bundle bundle = new Bundle();
        byte[] dataTest = new byte[] {0,1,2,3};

        switch (msgfromClient.what)
        {
            case MSG_READ:  // 客户端读取数据
                msg.what = MSG_READ;
                msg.arg1 = msgfromClient.arg1;

                bundle.putByteArray("dataTest", dataTest);
                
                msg.setData(bundle); // msg 利用 bundle 传递数据
                msg.replyTo = htMessenger;
                
                try {
                    msgfromClient.replyTo.send(msg);
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }    
                break;
        }
    }
}

3、效果演示

【Android】小白进阶之基于HandlerThread的Messenger进程间通信浅析_Android开发