使用Messenger实现进程间的相互通信
来源:互联网 发布:手机淘宝评论怎么截图 编辑:程序博客网 时间:2024/06/05 14:58
通过Messenger可以在不同进程之间通过传递Message对象实现进程间数据的传递;Messenger是一种轻量级的IPC方案,低层使用AIDL实现。由于Messenger一次处理一个请求,因此在不存在并发执行的情况下,不再考虑线程同步问题。
下面我们来看具体的实现
我们这里首先在一个应用中创建不同的两个进程,创建MessengerActivity与MessengerService这两个处于不同进程的类,在MessengerService注册时指定它所对应的进程
<activity android:name="com.example.ipcstudy.MessengerActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.example.ipcstudy.MessengerService" android:process=":MessengerService"/>"
android:process=”:MessengerService” 指定MessengerService在com.example.ipcstudy:MessengerService进程中;MessengerActivity默认在com.example.ipcstudy进程中。
MessengerService类的实现:
package com.example.ipcstudy;import android.app.Service;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.widget.Toast;public class MessengerService extends Service{ //创建Handler用于MessengerActivity中传递的Message对象 private Handler messengerHandler=new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case MessengerActivity.MESSENGER: //获取信息内容并Toast Toast.makeText(MessengerService.this, msg.getData().getString("content"), 0).show(); //获取MessengerActivity中replyMessenger对象 Messenger messenger=msg.replyTo; //创建传递的消息对象 Message replyMessage=Message.obtain(null, MessengerActivity.MESSENGER); Bundle bundle=new Bundle(); bundle.putString("reply", "我已经收到消息!"); replyMessage.setData(bundle); try { //给MessengerActivity发送消息 messenger.send(replyMessage); } catch (RemoteException e) { e.printStackTrace(); } break; default: break; } }; }; private Messenger messenger=new Messenger(messengerHandler); @Override public IBinder onBind(Intent intent) { //返回IBinder对象 return messenger.getBinder(); }}
MessengerActivity类的实现
package com.example.ipcstudy;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.widget.Toast;public class MessengerActivity extends Activity{ public static final int MESSENGER=111; private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) {} @Override public void onServiceConnected(ComponentName name, IBinder service) { //通过服务返回的IBinder对象创建Messenger对象 Messenger messenger=new Messenger(service); //创建Message对象 Message message=new Message(); message.what=MESSENGER; Bundle bundle=new Bundle(); bundle.putString("content", "通过Messenger进行跨进程通信"); message.setData(bundle); //将接收消息的replyMessenger传递给MessengerService message.replyTo=replyMessenger; try { //向MessengerService发送消息 messenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } } }; /** * 用于接收MessengerService传递过来的数据Message对象 */ private Messenger replyMessenger=new Messenger(new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case MESSENGER: //获取信息内容并Toast Toast.makeText(MessengerActivity.this, msg.getData().getString("reply"), 0).show(); break; default: break; } }; }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //绑定服务 Intent intent=new Intent(this,MessengerService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); unbindService(conn); }}
注意:
Messenger中进行数据传递必须将数据放入Message中,而Messenger与Message都实现了Parcelable接口,因此可以跨进程传输。
Message只能使用what,arg1,arg2,Bundle,replyto传递信息,Message中object字段仅支持系统提供的实现了Parcelable接口的对象传递信息,我们自己定义Parcelable对象不能进行传输。
1 0
- 使用Messenger实现进程间的相互通信
- Android使用Messenger实现进程间通信
- 使用Messenger实现进程间通信
- 进程间通信Messenger的简单使用
- 进程间通信使用Messenger
- 使用Messenger实现进程间通信(IPC)
- 简述使用Messenger进行进程间的通信
- Android:Service进程间相互通信: Messenger(系列4)
- Android进程间通信(3)-Messenger实现
- Android进程间通信(三):使用Messenger实现进程间通信
- Android进程间通信之使用Messenger
- 使用Messenger进行进程间通信
- Android进程间通信之使用Messenger
- Messenger(信使)进程间通信使用
- Android 进程间通信之使用Messenger
- Android进程间通信之使用Messenger
- 进程间通信----Messenger
- 进程间通信 Messenger
- 树梅派 更换源后,依然从官方源更新
- POJ3349_Snowflakes
- nyoj_106 背包问题
- Handler简单用法
- Leetcode - Excel Sheet Column Title
- 使用Messenger实现进程间的相互通信
- Worm
- 类成员函数回调
- ZOJ 3938 Defuse the Bomb(水题)
- LCA最近公共祖先问题(Tarjan离线算法)
- HDU 4502 吉哥系列故事——临时工计划(dp)
- 练习赛
- IO学习(六)拷贝文件夹
- 算法学习笔记之鸡兔同笼