美文网首页
IPC进程间通信(开发艺术探索)

IPC进程间通信(开发艺术探索)

作者: 云木杉 | 来源:发表于2018-12-17 15:17 被阅读0次

使用多进程造成的问题

  • 静态成员和单例模式完全失效
  • 线程同步机制完全失效
  • SharedPreferences的可靠性下降
  • Application会多次创建

进程间通信方式

  • 通过Intent来传递数据,共享文件和SharedPreferences
  • 基于Binder的Messager和AIDL以及Socket等。

序列化与反序列化

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。

简单地说,“序列化”就是将运行时的对象状态转换成二进制,然后保存到流、内存或者通过网络传输给其他端。

Parcelable

方法 功能 标记位
createFromParcel(Parcel in) 从序列化后的对象中创建原始对象
newArray(int size) 创建指定长度的原始对象数组
User(Parcel in) 从序列化后的对象中创建原始对象
writeToParcel(Parcel dest, int flags) 将当前对象写入序列化结构中,其中flags标识有两种值,0或者1(参见右侧标记位),为1时标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况为0。 PARCELABLE_WRITE_RETURN_VALUE
describeContents() 返回当前对象的内容描述,如果含有文件描述符,返回1(参见右侧标记位),否则返回0,几乎所有情况都返回0 CONTENTS_FILE_DESCRIPTOR

aidl生成的类

  • DESCRIPTOR descriptor

Binder的唯一标示,一般用当前的Binder的类名表示。

  • asInterface(android.os.IBinder obj)

用于将服务端的的BInder对象转换成客户端所需的AIDL接口类型的对象,这种转换过程是区分进程的,如果客户端和服务端位于同一进程,那么此方法返回的就是服务端的Stub对象本身,否则返回的是系统封装好的Stub.proxy对象。

  • onTransact()

这个方法运行在服务端的BInder线程池中,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交

创建AIDL

  • 使service端的AIDL与客户端的Java同级

AIDL大致流程

*首先创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端就可以绑定服务端Service,建立之后就可以访问远程服务端的方法。

ContentProvider

  • onCreate 方法创建 做初始化动作 只要onCreate运行在主线程
  • getType 用来返回Uri请求所对应的MIME类型,比如图片,视频等。
  • query 查询
  • update 更新
  • insert 插入
  • delete 删除

Socket

  • Socket也称为套接字,分为流式套接字和用户套接字两种分别对应网络的传输控制层的TCP和UDP协议。
  • TCP连接的建立需要经过"三次握手"才能完成。为了提供稳定的数据传输功能,本身提供超时重传机制。
  • UDP是无连接的。提供不稳定的单向通信功能。

虽然看完 还是模模糊糊,总比不看好的多吧

相关文章

网友评论

      本文标题:IPC进程间通信(开发艺术探索)

      本文链接:https://www.haomeiwen.com/subject/bqwshqtx.html