写点什么

底层学习 ---Android-IPC 机制(二)序列化机制,张口就来

用户头像
Android架构
关注
发布于: 刚刚

<activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" />


<category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>


<serviceandroid:name=".MyService"android:process="com.czy.process.test" />


并在启动 MainActivity 的同时启动 MyService ,这样,在系统进程列表中就可以看到这两个相关的进程



虽然开启多进程的方法并不算麻烦,但当应用开启了多进程后,其实会对来很多的负面影响,主要有以下几个:


  • 静态成员与单例模式失效

  • 线程同步机制失效

  • SharedPreferences 可靠性下降

  • Application 被创建多次


为了解决多进程带来的问题,系统也为开发者提供了很多的跨进程通信方式,比如文件共享、ContentProvider、Messenger、AIDL、Socket 等

二、Serializable

跨进程通信的目的就是为了进行数据交换,但并不是所有的数据类型都能被传递,除了基本数据类型外,还必须是实现了序列化和反序列化的数据类型才可以,即实现了 Serializable 接口或 Parcelable 接口的数据类型


Serializable 接口是由 Java 所提供的一个序列化接口,是一个空接口,为对象提供了标准的序列化和反序列化接口。类只要实现了该接口,即可自动实现默认的序列化过程。


package java.io;


public interface Serializable {}


此外,为了辅助系统完成对象的序列化和反序列化过程,还可以声明一个 long 型数据 serivalVersionUID


private static final long serivalVersionUID = 123456578689L;


序列化时系统会把对象的信息以及 serivalVersionUID 一起保存到某种介质中(例如文件或内存中),当反序列化时就会把介质中的 serivalVersionUID 与类中声明的 serivalVersionUID 进行对比,如果两者相同则说明序列化的类与当前类的版本是相同的,则可以序列化成功。如果两者不相等,则说明当前类的版本已经变化(可能是新增或删减了某个方法),则会导致序列化失败


如果没有手动声明 serivalVersionUID ,编译工具则会根据当前类的结构自动去生成 serivalVersionUID ,这样在反序列化时只有类的结构完全保持一致才能反序列化成功


为了当类的


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


结构没有发生结构性变化时依然能够反序列化成功,一般是手动为 serivalVersionUID 指定一个固定的值。这样即使类增删了某个变量或方法体时,依然能够最大程度地恢复数据。当然,类的结构不能发生太大变化,否则依然会导致反序列化失败


此外,静态成员变量属于类不属于对象,所以不会参与序列化过程,用 transient 关键字标记的成员变量也不会参与序列化过程

三、Parcelable

Parcelable 接口是由 Android 系统提供的序列化接口,官方也推荐使用 Parcelable 进行序列化操作,Bundle 、 Intent 和 Bitmap 等都实现了 Parcelable 接口。Parcelable 接口相比 Serializable 更为高效,但实现方式也相比麻烦些下面看个例子


/**


  • 作者:leavesC

  • 时间:2019/4/4 10:46

  • 描述:*/public class Demo implements Parcelable {


private String stringField;


private int intField;


private boolean booleanField;


public Demo(String stringField, int intField, boolean booleanField) {this.stringField = stringField;this.intField = intField;this.booleanField = booleanField;}


@Overridepublic int describeContents() {return 0;}


@Overridepublic void writeToParcel(Parcel dest, int flags) {

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
底层学习---Android-IPC机制(二)序列化机制,张口就来