zoukankan      html  css  js  c++  java
  • 第二章: IPC机制

      这章关于进程的概念,没有深入太多,只做了解跟学习

      IPC: Inter-Process Communication,进程间通信或者跨进程通信,两个进程之间进行数据交换的过程

      2.1介绍

        线程:CPU调度的最小单元,是一种有限的紫铜资源

        进程:一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用.

        一个进程可以包含多个线程,最简单的情况下,一个进程可以只有一个线程,即主线程,在android中主线程就是UI线程

      2.2 Android中的多进程模式

        2.2.1开启多线程模式(一般指一个应用中存在多个进程的情况)

          在AndroidManifest中指定android:process属性,属性值不同代表不同的进程

          如果是android:process=":remote",":"的含义是指要在当前的进程名前面附加上当前的包名.

          以":"开头的进程属于当前应用的私有进程,其它的属于全局进程,android系统会为每个应用分配一个唯一的UID,具有相同的UID的应用,并且签名相同才能进行数据交换.

         2.2.2 多进程模式的运行机制

          android为每一个应用分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,导致在不同的虚拟机中访问同一个对象会产生多份副本.

          使用多进程会造成如下几方面的问题:

        1. 静态成员和单例模式完全失效
        2. 线程同步机制完全失效
        3. SharedPreferences的可靠性下降(底层是通过读/写XML文件实现的)
        4. Application会多次创建(相当于重新启动一个应用的过程,会创建新的Application)

         2.3 IPC基础

          2.3.1 Serializable接口

            Serializable是Java所提供的一个序列化接口,是一个空接口,为对象提供标准的序列化和反序列化操作.

            实现序列化只需要一个类实现Serializable接口并申明一个serialVersionUID.

            使用ObjectOutputStream和ObjectInputStream实现写/读

          2.3.2 Parcelabel接口

            Parcel内部包装了可序列化的数据,可以在Binder中自由传输.也可以实现序列化

          但是推荐使用Serializable.

           

          2.3.3 Binder

            Binder是Android中的一个类,继承了IBinder接口

            从IPC角度来说,Binder是Android中的一种跨进程通信方式.

            从AndroidFrameword角度来说,Binder是ServiceManager连接各种Manager和相应ManagerService的桥梁

            从Android应用层来说,Binder是客户端和服务端进行通信的媒介.

            当bindService的时候,服务器会返回一个包含服务端调用的Binder对象,通过这个Binder对象,客户端就能获取服务端提供的服务或者数据.

            Binder主要用在Service中,包括AIDL和Messenger

            Binder工作原理:

            

            

        2.4 Android中的IPC方式

          2.4.1 使用Bundle

            三大组件(Activity,Service,Receiver)都支持在Intent中传递Bundle数据,由于Bundle实现了Parcelable接口,所以它可以方便的在进程间传输

          2.4.2 使用文件共享

            Android系统基于Linux,是的其并发读/写文件可以没有限制的进行,甚至一个线程同时对一个文件进行读写操作都是允许的,但是一般要尽量避免并发写,需要加锁,synchronize

            面对高并发的读/写访问,sharedPreferences有很大几率丢失数据,所以不建议在进程间通信使用sharedPreferences.

          2.4.3 使用Messenger(信使)

            在不同进程中传递Message对象.

            在Message中放入所传输的数据.Messenger的底层实现是AIDL

            实现Messenger一般有两个步骤,分为服务端和客户端

            服务端进程:创建一个Service来处理客户端的连接请求,同时创建一个Handler并通过它来创建一个Messenger对象,然后在Service的onBind中返回这个Messenger对象底层的Binder

            客户端进程:首先要绑定服务端的Service,绑定成功后用服务端返回的IBinder对象创建一个新的Messenger,通过这个Messenger发送消息(Message对象)

            Messenger工作原理:

             

            

          2.4.4 关于AIDL

            同样也有服务端跟客户端.

            服务端需要创建一个Service来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在AIDL文件中声明,最后在Service中实现这个接口

            客户端需要绑定服务端的Service,绑定成功后将服务器返回的Binder对象转换成AIDL接口所属的类型,接着调用AIDL中的方法

            (PS:这个目前感觉太底层了,没有太深入了解)

          2.4.5 ContentProvider

            ContentProvider的底层实现也是Binder.系统做了封装,使用简单一些

            主要使用CRUD操作和防止SQL注入和权限控制.

            继承ContentProvider类,实现六个抽象方法:onCreate,query,update,insert,delete和getType

            onCreate代表ContentProvider的创建,一般用来做一些初始化工作

            getType用来返回一个Uri请求所对应的MIME类型(媒体类型)

            <provider>标签中需要声明android:authorities代表ContentProvider的唯一标识,android:readPermission和android:writePermission属性分别声明读权限和写权限

          2.4.6  使用Socket

            Socket(套接字),分为流式套接字和用户数据报套接字两种,分别对应于网络的传输控制层中的TCP和UDP协议.

            TCP协议是面向连接的协议,提供稳定的双向通信功能,TCP需要"三次握手"才能完成,本身提供了超时重传机制.

            UDP是无连接的,提供不稳定的单项通信,在性能上,UDP具有更好的效率,缺点是不能保证数据一定能够正确传输.

            使用Socket需要声明权限

              <users-permission android:name="android.permission.INTERNET"/>

              <users-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

          2.5 Binder连接池

            工作原理:

              

           

            

            

  • 相关阅读:
    Phaser中很多对象都有一个anchor属性
    prelaod场景,用来显示资源加载进度
    Eclipse rap 富客户端开发总结(11) : rcp/rap与spring ibatis集成
    Eclipse rap 富客户端开发总结(10) : Rap不同系统间的差异和处理方式
    Eclipse rap 富客户端开发总结(9) : rap上传与下载
    Eclipse rap 富客户端开发总结(8) : 发布到tomcat后解决rap编码和字符集的问题
    Eclipse rap 富客户端开发总结(7) : 如何修改rap的样式
    Eclipse rap 富客户端开发总结(6) : 如何发布rap到tomcat
    Eclipse rap 富客户端开发总结(5): RAP国际化之路
    Eclipse rap 富客户端开发总结(4):如何搭建 rap 中文开发环境
  • 原文地址:https://www.cnblogs.com/JingQ/p/6166425.html
Copyright © 2011-2022 走看看