阅读手札:《Android开发艺术探索》(二)

简介: 在 《阅读手札:《Android开发艺术探索》(一)》中主要介绍了Activity的生命周期以及异常处理、启动模式、意图过滤器。本篇文章主要介绍的是《Android开发艺术探索》的第二章 IPC机制个人评语:第二章的内容非常多(第二章近90页内容),内容有IPC机制基本概念;序列化Serializable、Parcelable;Binder;实现IPC的多种方式;Binder连接池内容非常多,但还是要耐着性子分析完。

《阅读手札:《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的方式有:


img_c852d0b3ef3a7619e638e9ff139e85ab.png
IPC实现方式

如果这篇文章对你有帮助,希望各位看官留下宝贵的star,谢谢。

Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用,也希望大家尊重笔者的劳动成果。

相关文章
|
15天前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
19天前
|
消息中间件 网络协议 Java
Android 开发中实现数据传递:广播和Handler
Android 开发中实现数据传递:广播和Handler
16 1
|
20天前
|
JSON 编译器 开发工具
VS Code阅读Android源码
VS Code阅读Android源码
30 1
|
9天前
|
存储 安全 Android开发
安卓应用开发:构建一个高效的用户登录系统
【5月更文挑战第3天】在移动应用开发中,用户登录系统的设计与实现是至关重要的一环。对于安卓平台而言,一个高效、安全且用户体验友好的登录系统能够显著提升应用的用户留存率和市场竞争力。本文将探讨在安卓平台上实现用户登录系统的最佳实践,包括对最新身份验证技术的应用、安全性考量以及性能优化策略。
|
12天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
13天前
|
监控 Java Android开发
安卓应用开发:打造高效用户界面的五大策略
【4月更文挑战第29天】 在安卓应用开发的世界中,构建一个既美观又高效的用户界面(UI)对于吸引和保留用户至关重要。本文将深入探讨五种策略,这些策略可以帮助开发者优化安卓应用的UI性能。我们将从布局优化讲起,逐步过渡到绘制优化、内存管理、异步处理以及最终的用户交互细节调整。通过这些实践技巧,你将能够为用户提供流畅而直观的体验,确保你的应用在竞争激烈的市场中脱颖而出。
|
2天前
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
|
2天前
|
物联网 Java 开发工具
安卓应用开发:打造未来移动生活
【5月更文挑战第10天】 随着科技的飞速发展,智能手机已成为我们日常生活中不可或缺的一部分。作为智能手机市场的两大巨头,安卓和iOS分别占据了一定的市场份额。在这篇文章中,我们将重点关注安卓应用开发,探讨如何利用先进的技术和创新思维,为用户打造更加便捷、智能的移动生活。文章将涵盖安卓应用开发的基本概念、关键技术、以及未来发展趋势等方面的内容。
|
4天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
11 0
|
5天前
|
Android开发 Kotlin
Kotlin开发Android之基础问题记录
Kotlin开发Android之基础问题记录
16 1