Android进程间通信之使用Messenger
来源:互联网 发布:数据库管理系统组成 编辑:程序博客网 时间:2024/05/16 07:02
Messenger,信使,可使用它进行进程间的通信,而Messenger对Service的请求采用队列的方式,因此它不支持多线程通信。
看看官方文档对于Messenger的解释:
Reference to a Handler, which others can use to send messages to it. This allows for the implementation of
message-based communication across processes, by creating a Messenger pointing to a Handler in one process,
and handing that Messenger to another process.
客户端和服务端可相互持有对方的Messenger来进行通信,下面我们来看看具体的实现。
服务端通过Messenger的getBinder方法将IBinder对象返给客户端,用于共享服务端的Messenger。
11-12 12:58:37.197: V/--DEBUG--(21322): 服务已链接
11-12 12:58:37.197: V/--DEBUG--(21268): 收到客户端发来的消息
11-12 12:58:37.197: V/--DEBUG--(21322): 客户端收到服务端发来的消息!
看看官方文档对于Messenger的解释:
Reference to a Handler, which others can use to send messages to it. This allows for the implementation of
message-based communication across processes, by creating a Messenger pointing to a Handler in one process,
and handing that Messenger to another process.
客户端和服务端可相互持有对方的Messenger来进行通信,下面我们来看看具体的实现。
在eclipse下创建两个工程,分别为客户端和服务端:
客户端的实现,创建客户端的Messenger,使用Messenger的构造方法指向一个handler实例,此handler用于处理服务端发过来的消息。
而客户端通过onServiceConnected获得服务端的Messenger,使用此Messenger给服务端发送消息,客户端的Messenger通过Message的replyTo传递给服务端。
public class MainActivity extends Activity {private static final String TAG = "--DEBUG--";// 用于启动service的ACTIONprivate static final String START_SERVER_ACTION = "com.young.server.START_SERVICE";private static final int WHAT_ON_TO_SERVICE = 1;private static final int WHAT_ON_TO_CLIENT = 2;private Button mBindBtn;private boolean isBindService = false;<a href="http://home.51cto.com/index.php?s=/space/5017954" target="_blank">@Override</a>protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mBindBtn = (Button) findViewById(R.id.bind_service);mBindBtn.setOnClickListener(new OnClickListener() {public void onClick(View v) {bindService(new Intent(START_SERVER_ACTION), conn, Context.BIND_AUTO_CREATE);}});}// client端Handler,用于处理server端发来的消息private Handler mClientHandler = new Handler(new Callback() {public boolean handleMessage(Message msg) {switch (msg.what) {case WHAT_ON_TO_CLIENT:Log.v(TAG, "客户端收到服务端发来的消息!");break;default:break;}return false;}});// client端Messengerprivate Messenger mClientMessenger = new Messenger(mClientHandler);private ServiceConnection conn = new ServiceConnection() {public void onServiceDisconnected(ComponentName name) {Log.v(TAG, "服务已断开");isBindService = false;mClientMessenger = null;}public void onServiceConnected(ComponentName name, IBinder service) {Log.v(TAG, "服务已链接");isBindService = true;// 获得server端信使Messenger实例Messenger serverMessenger = new Messenger(service);// 向server端发送的消息Message toServerMessage = Message.obtain(null, WHAT_ON_TO_SERVICE);// 通过replyTo把client端的信使传递给servicetoServerMessage.replyTo = mClientMessenger;try {serverMessenger.send(toServerMessage);} catch (RemoteException e) {e.printStackTrace();}}};protected void onStop() {if (isBindService)unbindService(conn);super.onStop();};}服务端Service的实现,服务端接收到客户端的消息以后,通过Message的replyTo取出客户端的Messenger,使用此Messenger给客户端发送消息,这就实现了进程之间的双向通信。
服务端通过Messenger的getBinder方法将IBinder对象返给客户端,用于共享服务端的Messenger。
public class RemoteService extends Service {private static final String TAG = "--DEBUG--";private static final int WHAT_ON_TO_SERVICE = 1;private static final int WHAT_ON_TO_CLIENT = 2;// server端handler,用来处理client发来的消息private Handler mServerHandler = new Handler(new Callback() {public boolean handleMessage(Message msg) {switch (msg.what) {case WHAT_ON_TO_SERVICE:Log.v(TAG, "收到客户端发来的消息");// server端获得client端的信使MessengerMessenger clientMessenger = msg.replyTo;Message toClientMsg = Message.obtain(null, WHAT_ON_TO_CLIENT);try {// 使用客户端Messenger向客户端发送消息clientMessenger.send(toClientMsg);} catch (RemoteException e) {e.printStackTrace();}break;default:break;}return false;}});// server端信使Messengerprivate Messenger mServerMessenger = new Messenger(mServerHandler);public IBinder onBind(Intent intent) {return mServerMessenger.getBinder();}再来看看服务端service的声明,因为要在其他进程中启动service,所以设置android:exported为true,此外还为service加入启动了权限。
<permission android:protectionLevel="normal" android:name="young.permission.START_SERVICE"></permission><serviceandroid:name="com.young.server.RemoteService"android:permission="young.permission.START_SERVICE"android:exported="true" ><intent-filter><action android:name="com.young.server.START_SERVICE" /></intent-filter></service>最后要在客户端添加相应的启动Service权限。
<uses-permission android:name="young.permission.START_SERVICE" />程序运行后的结果,可以看到客户端和服务端都收到了对方发来的消息。程序运行后的结果,可以看到客户端和服务端都收到了对方发来的消息。
11-12 12:58:37.197: V/--DEBUG--(21322): 服务已链接
11-12 12:58:37.197: V/--DEBUG--(21268): 收到客户端发来的消息
11-12 12:58:37.197: V/--DEBUG--(21322): 客户端收到服务端发来的消息!
1 0
- Android进程间通信之使用Messenger
- Android进程间通信之使用Messenger
- Android 进程间通信之使用Messenger
- Android进程间通信之使用Messenger
- android进程间通信之Messenger
- Android进程间通信之Messenger
- Android进程间通信之Messenger浅析
- Android进程间通信(IPC)之Messenger
- 初识Android进程间通信之---Messenger
- Android进程间通信之Messenger
- android-----IPC进程间通信之Messenger
- Android 进程间通信之Messenger
- android—进程间通信之Messenger
- Android进程间通信之Messenger
- Android 进程间通信之Messenger
- Android进程间通信之Messenger
- Android之进程间通信(IPC)-Messenger
- Android使用Messenger实现进程间通信
- Volley ImageLoader实现图片瀑布流
- 菜鸟级springmvc+spring+mybatis整合开发用户登录功能(下)
- 【more effective c++读书笔记】【第5章】技术(7)——让函数根据一个以上的对象类型来决定如何虚化(1)
- 用指针方法排序数组
- Lua中的loadfile、dofile、require详解
- Android进程间通信之使用Messenger
- 代码生成 避免重复劳动 省时省力
- popwindwo遇到.9.png出现bug
- http 下载文件中文文件名在 firefox 下乱码问题
- Android入门之网络图片查看器
- 自己平常用的广告滚动
- 博客正式开通!!
- Qt5.4.1移植到arm——Linuxfb篇
- 黑马程序员_java01_基本知识点