底层学习---Android-IPC机制(二)序列化机制

本文介绍了在Android应用中开启多进程的方法,以及如何通过Serializable和Parcelable接口进行对象序列化以支持跨进程通信。特别关注了静态成员和单例模式在多进程环境中的影响,以及如何解决这些问题。
摘要由CSDN通过智能技术生成

有时候应用因为某些原因需要采用多进程模式,此时如果要在应用内的不同进程间进行通信,就需要使用到 IPC 机制。或者是两个不同的应用需要进行数据交换,此时也一样需要依靠 Android 系统提供的 IPC 方案

本篇以及后续几篇文章,都会对 Android 系统下的 IPC 机制进行介绍,部分内容来自我对 Android开发艺术探索 该书的理解。

本篇文章就先介绍 Android 系统开启多进程的方法以及对象的序列化方法

一、开启多进程

为一个 Android 应用开启多进程模式的方法有两种。第一种方法是在 AndroidMenifest 中为四大组件指定 android:process 属性,为其声明要在哪个进程名下运行,即可开启多进程。第二种方法是通过 JNI 在 native 层中 fork 一个新的进程。这里只讨论第一种方法。

Android 应用默认在命名为包名的进程下运行,除非你为其指定了 android:process 属性
例如,这里创建一个应用,包名为 com.czy.ipc ,再指定四大组件之一的 Service 运行在其它进程下

并在启动 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 ,这样在反序列化时只有类的结构完全保持一致才能反序列化成功

为了当类的结构没有发生结构性变化时依然能够反序列化成功,一般是手动为 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;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

Android架构师之路很漫长,一起共勉吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

架构师之路很漫长,一起共勉吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值