IPC(Inter-Process Communication,进程间通信),安卓进程进的通信方式常用的有两种:AIDL方式和Messager方式。前者一般用于跨应用,后者长用于应用间,Messenger本质虽然也是AIDL,但与其不同的是,它是基于Handler,故为线程安全的,而AIDL支持并发,不是线程安全的。下面是Messenger方式通信的一个简单的例子:
在demo中,一个MainActivity,里面定义一个按钮,点击按钮时,向FirstService发送一个消息,service收到消息后,携带参数回应MainActivity,即向activity发送一个消息,activity收到消息,将其Toast
以下是MainActivity的核心代码:
按钮点击时,绑定FirstService:
button3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,FirstService.class);
bindService(intent, connection, Service.BIND_AUTO_CREATE);
}
});
以上代码中的connection定义如下:
public Messenger messenger = new Messenger(new Handler() {
@Override
//activity接收到service的消息后的处理
public void handleMessage(Message msg) {
if (msg.what == FirstService.GET_RESULT) {
Log.v("aa", " -----handleMessage-- ");
ArrayList<String> list = (ArrayList<String>) msg.obj;
Toast.makeText(getApplicationContext(), list.get(0)+":"+list.get(1), 2000).show();
}
else {
super.handleMessage(msg);
}
};
});
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.v("aa", "- ---onServiceConnected ---------");
mService = new Messenger(service);
// 与service绑定成功后,向其发送消息
Message message = Message.obtain(null, FirstService.GET_RESULT);
message.replyTo = messenger;
try {
mService.send(message);
}
catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.v("aa", "-onServiceDisconnected------");
mService = null;
}
FirstService的代码:
public Messenger messenger = new Messenger(new Handler(){
private ArrayList<String> list = new ArrayList<String>();//参数传递
@Override
public void handleMessage(Message msg) {
if(msg.what == GET_RESULT){
try {
list.add("ss");
list.add("bb");
//向activity发送携带参数的消息
msg.replyTo.send(Message.obtain(null, GET_RESULT, list));
}
catch (RemoteException e) {
e.printStackTrace();
}
}else{
super.handleMessage(msg);
}
};
});
@Override
public IBinder onBind(Intent arg0) {
Log.v("FirstService", "------------------onBind---");
return messenger.getBinder();
}
大概的流程如下图:
完整代码下载:
http://download.csdn.net/detail/wuqingyidongren/9463362