使用多进程造成的问题
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- 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是无连接的。提供不稳定的单向通信功能。
虽然看完 还是模模糊糊,总比不看好的多吧
网友评论