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、效果演示