安卓ipc机制
文章目录 前言1. Android中多进程的创建与常见问题1.1 使用多进程会造成的问题 2. 基础概念2.1 Binder 3. Android中可使用的IPC方式4 不同的IPC优缺点,及使用方式
前言
写这篇文章的意义是梳理对AndroidIPC机制的理解,主要是上层原理及使用
IPC的含义为进程间通信或者跨进程通信,也就是数据交换,进程和线程的区分从操作系统角度来说,线程是CPU的最小调度单元,同时也是一种有限资源,进程指的是一个执行单元在Android上指一个应用,进程可以包含很多个线程(包含与被包含的关系)通常一个应用也就进程都会包含至少一个线程,就是我们熟悉的UI线程(主线程)如果进程需要执行大量的耗时任务这个时候都在UI线程做就会造成界面无法响应(ANR),就需要我们用子线程去做这些耗时的任务。
1. Android中多进程的创建与常见问题
Android中使用多进程的方法常规就是在AndroidManifest是指定Android:process属性,不能给一个线程或实体类指定运行时所在进程,或者去JNI层fork一个进程。
指定Android:process属性需要注意的地方:
进程名以:“:” 开头进程属于应用私有进程进程名以:“.” 开头的进程属于全局进程 1.1 使用多进程会造成的问题 静态成员和单例模式完全失效线程同步机制完全失效SharedPreferences可靠性下降Application会多次创建
静态成员和单例模式完全失效原因
Android会为每个进程都分配一个独立的虚拟机,这就意味着不同的虚拟机在内存分配的地址空间不同,会导致在不同虚拟机访问同一个类对象会产生多个副本,如果我们要修改这个对象也只是修改当前进程中的副本对象,影响的只是当前进程,不会影响其他进程的副本对象。
线程同步机制完全失效
因为不同进程都有独立的内存空间,所以没有在同一块内存了,锁任何东西都无法保证线程同步,锁的也只是当前进程的副本对象而不是同一个对象。
SharedPreferences可靠性下降
SharedPreferences底层通过读写xml文件来实现,会存在一定的并发可能,SharedPreferences不支持两个进程同时进行读或写操作。
Application会多次创建系统创建进程同时会分配虚拟机,这个过程与启动应用是一致的,可以理解为系统又把应用重启了一遍既然重新启动了那么创建新的Application就是正常的了简单直白的来说,在同一个进程的组件是属于同一个虚拟机和Application,那么在不同进程中运行的组件就属于不同的虚拟机和Application
2. 基础概念
在跨进程通信中我们需要先了解以下三个内容:
Serializable Parcelable Binder
为什么要了解Serializable,Parcelable,熟悉的都知道这两个都是为对象提供序列化的一种方式,两者一个是Java常用一个是Android推荐,为什么要重点圈出这个呢?是因为在IPC通信过程中对象的序列化与反序列化与这两个是密不可分的,我们可以选择其一就可,这里推荐还是用Parcelable。
Serializable,Parcelable的区别在于Serializable的序列化与反序列化过程有大量的I/O操作,Parcelable是Android序列化方式就是用的麻烦一点,Parcelable主要用在内存序列化上但效率高。总结:想简单一点用Serializable,高效一点用Parcelable 2.1 Binder
关于binder的使用本来想写的但是搜了一下网上实在太多了就不造轮子式写了
关于Binder的文章网上到处是越看越晕,关于binder是什么可以从以下几个角度来看:
Binder是Android的一个类,实现了Ibinder接口IPC角度来说Binder是Android中的一种跨进程通信方式Binder也可以理解为一种虚拟的物理设备,设备驱动在/dev/binder从Android框架层来看Binder是serviceManager连接各种Manager(ActivityManager、WindowManager等)和相应ManagerService的桥梁从应用层来看Binder是客户端和服务端通信的媒介
3. Android中可使用的IPC方式 Bundle文件共享MessengerAIDL使用Content ProviderSocekt 4 不同的IPC优缺点,及使用方式