android加深笔记--IPC通信之Messenger

最近在看android开发艺术探索,感觉挺不错的,有很多之前自己没有接触的或者印象不太深刻的,以前一直都是转载别人,自己看看,就觉得会了。但现在总觉得,码农虽然贯穿懒字原则,但是适当的动手能力还是要有,个人不太习惯一有新需求就百度别人已经做好的在上面改改改,或者找别人封装好的直接用,这样感觉对自身技术提升太过狭隘了吧,所以打算做这样一些加深笔记,利人利己吧!


一.Messenger

Messenger意为信使,通过它可以在不同进程中传递Message对象,可以轻松实现进程间数据传递,它是一种轻量级的IPC方案,底层实现为AIDL,优点是我们可以方便的进行进程间通信,不用考虑线程同步问题,缺点就是它一次只能处理一个请求。Messenger是以串行方式处理发送端的消息,如果有大量消息同时到达,它还是只能一个个处理,而且Messenger主要用来传递消息,如果需要跨进程调用方法,就不能使用它,而是用AIDL。


二.代码示例

新建一个android项目,写个类继承Service。

public class MessengerService extends Service {

	private final static int MSG_FROM_CLIENT = 1;
	private Messenger messenger = new Messenger(new MessengerHandler());

	private class MessengerHandler extends Handler {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case MSG_FROM_CLIENT:
				Toast.makeText(MessengerService.this, "msg from client:" + msg.getData().getString("from"),
						Toast.LENGTH_SHORT).show();
				Messenger m = msg.replyTo;
				Message message = Message.obtain(null, MSG_FROM_CLIENT);// 该消息是发送给客户端进程的
				Bundle bundle = new Bundle();
				bundle.putString("to", "你好,我已收到你的消息");
				message.setData(bundle);
				try {
					m.send(message);
				} catch (RemoteException e) {
					e.printStackTrace();
				}
				break;

			default:
				break;
			}
		}
	}

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


在配置文件中注册这个Service,并让其运行在单独的进程中。

<span style="white-space:pre">	</span><service android:name="com.example.Service.MessengerService"
           android:process=":remote"></service>

代码还是简单易懂的,服务端进程绑定了binder,在接收到客户端进程消息时,回给客户端进程一个消息。


下面是客户端进程代码。

在ManActivity里启动服务
Intent intent =new Intent(this, BookManagerService.class);
		bindService(intent, mAIDLConnection, BIND_AUTO_CREATE);

	private void startMessengerService(){
		Intent intent =new Intent(MainActivity.this,MessengerService.class);
		bindService(intent, connection, BIND_AUTO_CREATE);
	}
	private Messenger messenger =new Messenger(new ClientHandler());
	private class ClientHandler extends Handler{
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case MSG_FROM_SERVICE:
				//接收服务端发来的消息
				Toast.makeText(MainActivity.this, msg.getData().getString("to"), Toast.LENGTH_SHORT).show();
				break;

			default:
				break;
			}
		}
	}
	private ServiceConnection connection =new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			Messenger messenger =new Messenger(service);
			Message message =Message.obtain(null, MSG_TO_SERVICE);
			Bundle data =new Bundle();
			data.putString("from", "我来自客户端");
			message.setData(data);
			message.replyTo=messenger;
			try {
				messenger.send(message);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	};

运行,就能看到服务进程和客户端进程交流成功了。

猜你喜欢

转载自blog.csdn.net/w358637319/article/details/50248635