Android---IPC机制
来源:互联网 发布:淘宝文艺女装店 编辑:程序博客网 时间:2024/05/16 12:32
IPC简介
IPC —Inter-Process Communication 含义就是进程间通信,或者跨进程通信
IPC的适用场景以及优缺点
IPC 基础概念
Parcelable
Android中使用Parcelable来实现序列化
AndroidStudio中使用插件来实现序列化类, 请移步
Binder
- 从Android FrameWordk层: Binder 是ServiceManager连接各种Manager(ActivityManager, WindowManager, ……)和相应ManagerService的桥梁
- 从Android角度: Binder是客户端和服务器端进行通信的媒介,当bindService的时候,服务器会返回一个包含了服务器端业务调用的Binder对象,通向这个Binder对象,客户端可以通过服务器端提供的服务或者数据.
Android中的ICP
1.Bundle
2.文件共享
3.Messenger (信使)
Messenger 对AIDL进行封装,底层实现还是AIDL.以串行的方式处理客户端发来的的消息,如果客户端发来大量的消息,Messenger还是一个个处理. 所以Messenger 在跨进程中最主要的作用就是传递消息,故名信使
Messenger所涉及到的就是 Message(消息),通过Handler来发送消息和接受消息.
工作原理
服务器端进程
- 创建一个Service,用来处理客户的的连接请求. MessengerService extend Service
- 创建一个Handler mHandler = new Handler();
- 使用mHandler 来创建一个Messenger对象, Messenger mMessenger = new Messenger(mHandler);
- Service 的onBind(){ return mMessenger.getBinder();}
客户端进程
- 绑定服务器端的Service,绑定成功,返回的IBinder对象创建一个Messenger
- 通过这个Messenger向服务器发送消息,类型为Message
服务器代码
public class MessengerService extends Service { private static final String TAG = "MessengerService"; //TODO ① 创建一个Handler private static class MessengerHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MyConstants.MSG_FROM_CLIENT: Log.i(TAG, "receive msg from Client:" + msg.getData().getString("msg")); Messenger client = msg.replyTo; Message relpyMessage = Message.obtain(null, MyConstants.MSG_FROM_SERVICE); Bundle bundle = new Bundle(); bundle.putString("reply", "嗯,你的消息我已经收到,稍后会回复你。"); relpyMessage.setData(bundle); try { client.send(relpyMessage); } catch (RemoteException e) { e.printStackTrace(); } break; default: super.handleMessage(msg); } } } //TODO ② 使用创建的Handler 来创建 Messenger private final Messenger mMessenger = new Messenger(new MessengerHandler()); @Override public IBinder onBind(Intent intent) { //TODO ③ 返回Messenger的 Binder return mMessenger.getBinder(); } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); }}
客户端代码
public class MessengerActivity extends Activity { private static final String TAG = "MessengerActivity"; private Messenger mService; private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler()); private static class MessengerHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MyConstants.MSG_FROM_SERVICE: Log.i(TAG, "receive msg from Service:" + msg.getData().getString("reply")); break; default: super.handleMessage(msg); } } } // TODO ① 绑定一个服务 private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { //TODO ②使用Ibinder 来创建Messenger mService = new Messenger(service); Log.d(TAG, "bind service"); //TODO ③Message 为传输数据 Message msg = Message.obtain(null, MyConstants.MSG_FROM_CLIENT); Bundle data = new Bundle(); data.putString("msg", "hello, this is client."); msg.setData(data); msg.replyTo = mGetReplyMessenger; try { //TOOD ④ Messenger.send 发送Message 到服务器 mService.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } public void onServiceDisconnected(ComponentName className) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_messenger); Intent intent = new Intent("com.ryg.MessengerService.launch"); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { unbindService(mConnection); super.onDestroy(); }}
未完待续……….
2 0
- Android IPC机制详解
- Android IPC机制详解
- Android IPC 机制详解
- Android IPC机制 详解
- Android IPC机制详解
- Android IPC机制详解
- Android的IPC机制
- Android IPC机制详解
- Android IPC机制详解
- android IPC机制
- Android Binder IPC机制
- android ipc机制
- Android读书笔记-------IPC机制
- android 学习 IPC机制
- Android AIDL IPC机制
- android的IPC机制
- Android IPC机制
- Android的IPC机制
- typeof的用法 typeof的返回值是一个字符串 返回的字符串类别
- 天线增益
- leetcode 27 Remove Element
- 入门训练 园的面积
- ListView优化中View Holder为什么用static声明为静态内部类
- Android---IPC机制
- python字符串格式化
- luogu【P1706】全排列问题
- test 10 problem C:最近公共祖先(线段树+乱搞)
- 进程间相互通信(pipe方式)
- CentOS7.0安装Docker
- canvas绘制渐变
- [Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium
- Rxjava(过滤类)-Distinct