AIDL详解之Messenger
来源:互联网 发布:mac 抹除系统 重装 编辑:程序博客网 时间:2024/06/05 09:04
本技术博文计划分为三个系列:
一、AIDL的基础,http://blog.csdn.net/wangqiubo2010/article/details/78601666。
二、AIDL之Messenger.。
三、AIDL终极篇之AIDL架构设计,http://blog.csdn.net/wangqiubo2010/article/details/78625846。
本博文是AIDL系列的第二篇,Messenger。
Messenger的本质,只要记住以下三点即可。
1、Messenger内部已经封装好,同样采用的AIDL,只是Messenger中用一个先进先出的队列来对收到的信息进行管理,也就是通过一个队列让消息按顺序执行,因此是不支持多线程并发处理的。
2、Messenger因为内部原理是AIDL,因此本质还是IBinder。
3、Messenger核心是handler,客户端通过获取到服务端的handler(外壳是messenger)来给服务器发送信息,同样如果服务端要发送信息给客户端则客户端也必须把自己的handler(外壳是messenger)传给服务端。
明白以上三个核心,来看具体应用。
package com.example.myservice;import android.app.Service;import android.content.Intent;import android.os.Bundle;import android.os.Debug;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.Parcelable;import android.os.RemoteException;import android.support.annotation.Nullable;import android.util.Log;import com.example.wangqiubo.myaidl.Book;import java.util.ArrayList;import java.util.List;/** * Created by wangqiubo on 2017/5/5. */public class MessengerService extends Service { private static ArrayList<Book> mBookList = new ArrayList<>(); @Override public void onCreate() { super.onCreate(); mBookList.add(new Book("乔布斯","1000","名人传")); mBookList.add(new Book("雷军","1001","名人传")); } @Nullable @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); } private static class MessengerHandler extends Handler{ public MessengerHandler() { } @Override public void handleMessage(Message msg) {// Debug.waitForDebugger(); if (0 == msg.what){ Log.d("messagerServer", "客户端发来了数据!"); Messenger clientMss = msg.replyTo; Bundle bundle = new Bundle(); bundle.putString("testStr", "lllll"); bundle.putParcelable("serverBook",mBookList.get(0)); bundle.putParcelableArrayList("serverBooks", mBookList); Message message = new Message(); message.what = 2; Book book = bundle.getParcelable("serverBook"); List<Book> myBooks = bundle.getParcelableArrayList("serverBooks"); message.setData(bundle); try { clientMss.send(message); } catch (RemoteException e) { e.printStackTrace(); } }else { super.handleMessage(msg); } } } private static Messenger messenger = new Messenger(new MessengerHandler());}
以上为服务端的代码,重点如下。
1、定义一个Messenger 变量,Messenger 变量构造函数参数为一个Handler。
2、请看自定义的MessengerHandler ,和平时使用的handler没有本质区别,通过handleMessage来处理客户端发送过来的信息请求。
3、 Messenger clientMss = msg.replyTo; 这行中 msg.replyTo 即是客户端传过来的 Messenger(本质是handler) ,通过本对象则直接向客户端发送信息。
4、传给客户端的为 messenger.getBinder()。
再来看看客户端的代码:
package com.example.wangqiubo.myapplication;import android.app.Service;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Debug;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.widget.Adapter;import android.widget.ListView;import com.example.wangqiubo.myaidl.Book;import java.util.List;public class Main2Activity extends AppCompatActivity { private Messenger remoteMessenger = null; private Messenger clientMessenger = null; private ListView mListView = null; private CustomBaseAdapter mAdapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAdapter = new CustomBaseAdapter(this); mListView = (ListView) this.findViewById(R.id.my_list_view); mListView.setAdapter(mAdapter); Intent intent = new Intent(); ComponentName componentName = new ComponentName("com.example.myservice", "com.example.myservice.MessengerService"); intent.setComponent(componentName); this.bindService(intent, mySer, Context.BIND_AUTO_CREATE); } private ServiceConnection mySer = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //SDebug.waitForDebugger(); Log.d("messager", "连接服务!"); remoteMessenger = new Messenger(service); Message message = Message.obtain(null,0); Bundle mBundle = new Bundle(); mBundle.putString("aa","bb"); message.setData(mBundle); ClientHanndler clientHanndler = new ClientHanndler(); Log.d("messagerLooper", clientHanndler.getLooper().toString()); clientMessenger = new Messenger(clientHanndler); message.replyTo = clientMessenger; try { remoteMessenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; private class ClientHanndler extends Handler{ @Override public void handleMessage(Message msg) { switch (msg.what){ case 2: //Debug.waitForDebugger(); Log.d("messager", "服务器进行了反馈!"); Bundle serverData = msg.getData(); if (null == serverData){ Log.d("messager", "serverData为空值"); return; } Book book = serverData.getParcelable("serverBook"); List<Book> books = serverData.getParcelableArrayList("serverBooks"); if (null != books && books.size() > 0) Log.d("messager", "从服务器中已经获取到了数据"); else { Log.d("messager", "从服务器中没有获取到了数据"); return; } mAdapter.setBookDatas(books); mAdapter.notifyDataSetChanged(); break; default: break; } super.handleMessage(msg); } }}
1、客户端的代码定义和服务端的定义基本一致,通过传过来的Binder转换成服务端的messenger,remoteMessenger = new Messenger(service)。
2、通过replayTo将客户端的messenger(本质处理信息的为handler)传递给服务器。
- AIDL详解之Messenger
- Android进程通信之Messenger&AIDL使用详解
- Android进程通信之Messenger&AIDL使用详解
- IPC机制之AIDL、Messenger
- AIDL详解之AIDL基础
- Android 跨进程双向通信(Messenger与AIDL)详解
- Android开发艺术探索——IPC之Messenger、AIDL
- Android:IPC,Messenger,AIDL
- 7. Binder, AIDL, Messenger
- AIDL详解(AIDL、Messenger两种方式实现跨进程通信,传递自定义对象)
- Messenger与AIDL的异同
- Messenger(轻量级的AIDL)
- Messenger与AIDL的异同
- 不用AIDL,我用Messenger
- Messenger与AIDL的区别
- Messenger与AIDL的异同
- Android之AIDL使用详解
- Android IPC之Messenger和AIDL(android开发艺术探索随笔)
- Android开发从一个activity设置跳转到另一个activity中的一个fragment中的一个viewpager中的某一个页面
- asp.net中HTML控件和web控件的简单理解
- Dubbo/Dubbox的服务消费(二)- 服务发现
- 超强、超详细Redis数据库入门教程
- 接口
- AIDL详解之Messenger
- Java泛型
- Picasso的简单实用
- SurfaceView介绍和通用模板
- 静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取
- 产品经理,原型设计之前你要做些什么?
- 内核启动kernel_init(init)进程分析
- 原始上传下载图片
- 阿里云ECS服务器挂载磁盘