标签:
1,Bundle一种最简单的进程间传递数据的方式
使用Bundle在进程间传递数据(数据要被序列化,基本数据类型都实现了序列化)。
Intent intent = new Intent("romote");
Bundle bundle=new Bundle();
bundle.putParcelable(KEY,new Book(1,"wcx"));
intent.putExtras(bundle);
startActivity(intent);
//另一个进程获取数据
Book book=getIntent().getParcelableExtra(MainActivity.KEY);
Log.e(LOG_TAG,book.toString());
2,通过文件共享的方式
比如把某个对象序列化到硬盘上,在另一个进程对其反序列化,获取对象的数据。
通过这种A进程写入到文件,B进程读取文件的方式,也可以实现数据共享。
但如果多进程并发的读写,会造成很大的麻烦。所以有并发的读写的操作,需要线程同步。
它适用于对数据同步要求不高之间的进程进行通信。
3,Messenger
Messenger可以在不同的进程中传递Message对象。而Message中可以放入我们需要传递的数据。
它是一种轻量级的IPC方式,它的底层是AIDL。
实现的步骤:
在远程服务中,创建Messenger对象时和一个Handler进行绑定。而此Handler负责处理客户端发送过来的消息。
在bind方法中通过getBinder(),返回Messenger中的Binder对象。
在客户端,通过绑定服务,服务连接后,获取到Binder对象,通过Binder对象,创建Messenger。
把客户端需要发送的消息封装到Message中。
Message的obj可以在同进程中传递数据,但在多进程里,obj只能指定系统提供的实现Parceable接口的对象。所以基本数据类型(实现的都是Serializable接口)都不可以。自定义的实现Parceable接口的对象也不可以。但是好在可以使用Bundle,Bundle支持所有序列化的对象。
封装数据完毕后,通过Messenger发送Message。
然后在远程服务的Handler去处理这些传递过来的数据。
远程服务:
private static final String LOG_TAG = "====>";
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(LOG_TAG, "线程id:" + android.os.Process.myPid() + "");
return messenger.getBinder();
}
//handler处理客户端发送的消息
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case MainActivity.CORRECT:
String name=msg.getData().getString("football");
Log.e(LOG_TAG,name);
break;
default:
Log.e(LOG_TAG, "default");
break;
}
}
};
Messenger messenger=new Messenger(handler);
客户端:
private void messengerMethod(){
//绑定服务
Intent intent=new Intent();
intent.setComponent(new ComponentName("asule.myhope","asule.myhope.MyMessengerService"));
bindService(intent,conn,BIND_AUTO_CREATE);
}
private ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messenger = new Messenger(service);
Message message=new Message();
message.what=CORRECT;
Bundle bundle=new Bundle();
bundle.putString("football", "ronaldo");
message.setData(bundle);
try {
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
上面的例子演示的是客户端发送数据到服务端。远程服务也可以通过Messenger回复客户端数据。
在客户端发送数据完毕后,通过Message.replayTo参数把客户端的Messager传递给服务端。服务端使用该Messager发送数据到客户端。
此时的客户端只需要创建Messenger,与一个处理数据的Handler进行绑定就大功告成了。
标签:
原文地址:http://blog.csdn.net/u012834186/article/details/51331169