1,单例模式 (私有化类中的构造方法)
懒汉 使用时创建 getInstance 里面new 注意同步
饿汉 一开始就创建 类static属性里面new getInstance返回实例
静态内部类, 静态内部类里面new 通过类.的方式调用 如Single.SingleHandler.single
枚举 枚举类里构造方法私有
2,序列化(数据转二进制)
进程间通信系统底层只认识字节序列
Java Serializable
android Parcelable
序列化 用于网络传输,数据持久化 编码Encode
反序列化 从网络,磁盘读取字节码还原成对象 解码(Decode)
目的:
1,永久保存对象数据
2,网上传输
3,进程间传递数据(Activity到另一个Activity)
注意
在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.
3,性能
空间开销 原有的数据上加上描述字段,以为反序列化解析之用 磁盘网络空间压力增加
时间开销 复杂的协议,解析时间增加
4,常见序列化协议
1,xml soap(基于xml)
2,json 更简洁,协议简单,解析速度快
3,ProtoBuf 更小,3-10倍,更快20-100倍
5,Android 序列化
Serializable
Serializable 用来标识当前类可以被 ObjectOutputStream 序列化,以及被 ObjectInputStream 反序列化。
一个实现序列化的类,它的子类也是可序列化的
静态成员变量属于类不属于对象,所以不会参与序列化
serialVersionUID 版本兼容
6,序列化源码
transient 修饰的不能被序列化 (比如密码属性不序列化)
在被反序列化后,transient 变量的值被设为初始值
静态成员不会被序列化 对象序列化保存的是对象的“状态”
Externalizable接口
这个接口的writeExternal()和readExternal()方法可以指定序列化哪些属性;
重写
writeExternal
readExternal
- writeReplace 先于writeObject
- readResolve后于readObject
序列化会导致单例失效
Parcelable接口
Parcelable通过Parcel实现了read和write的方法,从而实现序列化和反序列化,
Parcel (序列化数据打包)
实现类必须有一个 Creator 属性
两个方法 将Parcel还原成Java对象
反序列化这个数组
7,两个接口区别
Serializable性能分析
开销大,使用反射产生大量的临时变量
IO流的形式
Parcelable则是以IBinder作为信息载体
在内存上开销比较小
8,使用场景
内存之间传递数据采用Parcelable
数据进行持久化或者网络传输时操作复杂,一般这个时候推荐使用Serializable。
9,SQLite 与 SharedPreferences
10面试
Android里面为什么要设计出Bundle而不是直接用Map结构
Bundle -> ArrayMap 两个数组 一个存存储对象数据对应下标 一个对象数组保存key和value 内部使用二分法对key进行排序 二分法查找,适合小数据量操作
而HashMap内部则是数组+链表结构
HashMap使用Serializable进行序列化
而Bundle则是使用Parcelable进行序列 速度快
Android中Intent/Bundle的通信原理及大小限制
Binder 机制进行数据传送的
Binder 的缓冲区是有大小限制的(有的是2M) 一个进程默认16个binder线程,每个差不多128k,数据太大会提示
你看到 The Binder transaction failed because it was too large 这类 TransactionTooLargeException 异常时
为何Intent不能直接在组件间传递对象而要通过序列化机制?
intent 启动其他组件时,会离开当前应用程序进程,进入ActivityManagerService进程
Intent所携带的数据要能够在不同进程间传输
Linux系统,不同进程之间的java对象是无法传输
从而实现对象在 应用程序进程 和 ActivityManagerService进程 之间传输