0%

安卓开发艺术探索第二章学习笔记

本章主要学习IPC机制,首先介绍Android中多进程以及多进程开发中的常见注意事项,接着介绍Android中的序列化和Binder,然后详细介绍Bundle、文件共享、AIDL、Messenger、ContentProvider和Socket等进程通信模式。

2.1 Android IPC简介

IPC(Inter-Process Communication),即为跨进程通信,先理解线程和进程;线程:CPU调度的最小单元,同时线程是一种有限的系统资源,单个进程不单独享有能够使其独立运行的资源。而进程一般指一个独立单元,在PC和移动设备上指一个应用程序或者一个应用。一个进程包含多个线程。在Android中,主线程也叫UI线程,在UI线程里才可以操作界面元素。很多时候,一个进程要执行大量的耗时任务,如果这些任务放在主线程去执行就会导致界面无法响应,严重影响用户体验,会导致ANR(Application Not Responding),即应用无响应,解决问题时,把耗时操作放在线程(非UI线程)中即可。

IPC方式:Windows:剪切板、管道、邮槽进行进程间通信;Linux通过命名管道、共享内容、信号量来进行进程间通信。不同的操作系统采用不同的方式。Android基于Linux内核,但是也有自己独有的进程间通信方式,在Android中最有特色的就是Binder了,Binder可以轻松地实现进程间通信,Android还支持Socket进行进程间通信。

2.2 Android中的多进程模式

通过给四大组件指定android:process属性,我们可以轻易地开启多进程模式,但是多进程在使用的时候却有很多需要注意的地方。

2.2.1 开启多进程模式

一般多进程指一个应用中存在多个进程的情况。给四大组件指定android:process属性开启多进程,除此之外没有其他的方法,当然还有一种非常规的方法,就是通过JNI在native层去fork一个新的进程,但是这种方法特殊,不是常见的创建多进程的方法。

Android系统会给每个应用分配一个U唯一的ID,具有相同的UID的应用才能共享数据,两个应用通过sharedUID跑在同一个进程中是有要求的,需要这两个应用有相同的SHaredUID并且签名相同才可以。在这种情况下,他们可以互相访问对方的数据,比如data目录、组件信息,不管他们是否是跑在同一个进程中。当然如果他们跑在同一个进程中,那么除了能共享data目录、组件信息外,还能共享内存数据,或者说他们看起来像一个应用的两部分。

2.2.2 多进程模式运行机制
2.3.3 Binder

Binder是一个很深入的话题,这里先不深入探讨Binder的底层细节,因为Binder太复杂了。本章侧重Binder的使用以及上层原理。

直观来说,Binder是Android中的一个类,它实现了IBinder接口,从IPC角度来说,Binder是Android中进程间通信的一种方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没有,从Android Framework来说,Binder是ServiceManager连接各种manager(ActivityManager、WindowManager)和相应ManagerService的桥梁;从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,客户端可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。