阅读手札:《Android开发艺术探索》(二)
在 《阅读手札:《Android开发艺术探索》(一)》中主要介绍了Activity的生命周期以及异常处理、启动模式、意图过滤器。本篇文章主要介绍的是《Android开发艺术探索》的第二章 IPC机制
个人评语:第二章的内容非常多(第二章近90页内容),内容有IPC机制基本概念;序列化Serializable、Parcelable;Binder;实现IPC的多种方式;Binder连接池内容非常多,但还是要耐着性子分析完。
IPC基本概念:
IPC、是英文 Inter-Process-Communication的缩写,翻译过来就是跨进程通信或者进程间通信、进程简单理解就是一个应用或者一个程序、而线程是进程的最小执行单元,关于线程、
必须要理清的Java线程池(原创)这里有近万字的详细描述。那什么情况会考虑跨进程的通信,毕竟任何概念的设计出现都是为了解决问题以及应用实践而诞生的。
一般来说,跨进程通信的实现理由分为两种:
- A:某些原因下自身需要多进程来实现,如:特殊原因需要运行在独立的线程;或者为了加大一个应用的内存来获取更大的内存空间提高运行流畅度(参考某Q的做法)
- B:当前应用为了获取其他应用的数据
以上两种情况是跨进程通信的实现场景。
那如何开启跨进程通信?
在Android中开启多进程的方式只有一种:给四大组件在清单文件注册的时候,在对应的组件标签内部声明如下即可:
android:process = " "
注意,这种跨进程通信的标签有2种写法,写法的不同代表的意思也不同,假定现在的包名是:com.test.tzw
- 写法一:
android:process = ":newpro"
这种写法,标签代表的具体意思是(:这个符号)当前组件,运行的进程名称是,当前包名加进程名,也就是com.test.tzw:newpro,当然这也代表它是一个私有进程,不以:开头的进程属于全局进程,其他应用可以通过ShareUID方式跟他跑在同一个进程
- 写法二:
android:process = "com.test.loveandroid.newpro"
写法二,这是一种完整的命名方式,不会附加包名信息。
跨进程通信带来的问题:
跨进程通信也会带来一系列问题,在这种模式下带来的后果之前我们先搞清楚几个基本概念:
概念一:
Java基础告诉我们,静态成员变量在所有地方共享,一处修改所有对应的静态成员变量都会生效,但是Android系统为每一个应用都提供了一个独立的虚拟机,不同的虚拟机会有不同的地址空间,这就导致不同的虚拟机
访问同一个类的对象会有多个副本
概念二:
线程是基于进程存在的,进程有变化,线程对应也会存在相应的变化
概念三:
SharedPreferences是我们很熟悉的存储数据的方式,它的底层是用XML进行文件的读/写,如果跨进程同时操作可能会造成稳定性下降
概念四:
跨进程,理论上在系统上又开辟分配了一个新的虚拟机,同样Application也会根据开辟分配的次数创建对应的次数
总结,跨进程带来的问题如下:
- 静态成员变量和单例模式失效
- 线程同步机制完全失效
- SharedPreferences稳定性下降
- Application会多次创建
序列化:
大家对序列化都已经很熟悉了,这里就快速总结,序列化一共分2种,一种是Java自带的序列化,也就是Serializable,还有一种是Android提供的序列化,也就是Parcelable。实现序列化主要是为了通过Intent、Binder传输对象数据使用,当然,阿里的路由框架 也要求对象传递使用序列化,下面就逐个分析:
Serializable
这是Java为我们提供的,使用起来很简单,JavaBean对象直接实现Serializable接口,在声明一个 serialVersionUID即可,
当然,这个serialVersionUID不写也可以,但是会对反序列化过程产生影响,所以正确的使用姿势还是是按照说明,声明serialVersionUID,这个serialVersionUID一般为这个类的hash值。
注意:
- 静态成员变量属于类而不属于对象,所以不会参与序列化过程
- 使用transient关键字声明的成员变量不会被序列化
Parcelable
Parcelable序列化是Android给我们提供的一种序列化方式,它的写法稍微复杂,但是不用怕,现在已经有插件帮我们一键生成Parcelable序列化,而且Parcelable序列化效率比Serializable更高、且更方便我们在Android平台上面使用。
那么实现IPC的方式有:
如果这篇文章对你有帮助,希望各位看官留下宝贵的star,谢谢。
Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用,也希望大家尊重笔者的劳动成果。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python数据分析及可视化-小测验
本文中测验需要的文件夹下载链接: https://pan.baidu.com/s/1OqFM2TNY75iOST6fBlm6jw 密码: rmbt 下载压缩包后解压如下图所示: image.png 首先将5题的文件复制形成副本,如下图所示: image.png 在资源管理器的路径中输入cmd,如下图所示: image.png 在上图中输入后,按Enter键运行进入cmd窗口。 在cmd窗口中输入并运行命令: jupyter notebook,如下图所示: image.png 在上图中输入后,按Enter键运行自动打开浏览器并且进入jupyter notebook编程界面。 在jupyter notebook中,点击 第一题,ipynb和 第一题-副本.ipynb。 浏览器会新建两个标签页,如下图所示: image.png 在两个标签页中,读者可以对照题目要求完成做题。 下面是5道题目作者的答案和解析。 1.第一大题 1.1 第一步:导入相应的模块 最后2行代码可以使作图时不出现编码错误,分别用来正常显示中文标签和正常显示负号。 import pandas as pd from pand...
- 下一篇
关注对象公共方法
hashcode 默认对象在内存中的存储地址用来配合hashSet 等集合框架,put的时候,快速判断不存在用的,hashcode一样再比equal。(小心:equal一样的对象一定要有一样的hashcode,可以使用equal中的相关属性的hashcode,否则hashMap分分钟给你空指针) equal 比一样的值的。比如你和我一样是P6,但是你的P6是你的P6,不是一个,但是值是一样的。复用集合时重要方法,覆盖equal时一定要覆盖hashcode不然集合框架就不工作了。 == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。 toString 默认返回 类+hashcode。一定要覆盖toString,反馈对象的属性,他只在调试和日志中其诊断作用,反馈更多的内容,方便api使用者诊断问题。在单元测试中也起重要作用! public String toString() { return MoreObjects.toStringHelper(this).omitNullValues() .add...
相关文章
文章评论
共有0条评论来说两句吧...