Android进程间通信

作者: 墨白历险记 | 来源:发表于2018-09-29 17:03 被阅读50次

    IPC(Inter-Process Communication)
    含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程.

    说起进程间通信,我们首先要理解什么是进程,什么是线程.
    线程:一般指CPU调度的最小单元.
    进程:一般指一个执行单元,在PC和移动设备上指一个程序或一个应用.

    那么线程和进程之间有什么关系呢?
    一个进程可以包含多个线程,所以为包含和被包含的关系.
    最简单的情况下,一个进程中可以只有一个线程,即为主线程,在Android中也被称为UI线程,并且在UI线程里才能操作界面元素.

    很多时候一个进程中需要执行大量耗时的任务,如果这些任务放在主线程中去执行就会造成界面无法响应,会严重影响用户体验,这种情况在PC系统和移动系统中都存在,在Android中被描述为ANR(Application Not Responding),即应用无响应.那么解决该问题就会用到线程,将一些耗时操作放在线程中进行即可.

    正常情况下,在Android中多进程是指一个应用中存在多个进程的情况,因此这里我们暂不讨论两个应用之间的多进程情况.

    开启多进程模式:
    在Android中使用多进程只有一种方法,那就是在AndroidManifest中给四大组件(Activity,Service,Receiver,ContentProvider)指定android:process属性.除此之外没有其他的办法,也就是说我们无法给一个线程活一个实体类指定其运行时所在的进程.其实还有另一种非常规的多进程方法,那就是通过JNI在native层去fork一个新的进程,但这种方法属于特殊情况,并不是常用的创建多进程的方式,所以我们也暂不考虑这种情况.
    下面列举一个示例描述如何在Android中创建多进程.

    Paste_Image.png

    该示例分别为SecondActivity和ThirdActivity指定了process属性,并且它们的属性值不同,这意味当前应用又增加了两个新的进程.假设当前的应用的包名为"com.siqi.pisces",当SecondActivity启动时,系统会为它创建一个单独的进程,进程名为"com.siqi.pisces:second"; 当ThirdActivity启动时,系统也会为他创建一个单独的进程,进程名为"com.siqi.pisces.third";而同时应用的入口Activity是MainActivity,我们并没有为他指定process属性,那么它运行在默认进程中,默认进程的进程名是应用的包名.

    Paste_Image.png

    运行程序后我们可以看见如上图所示,进程列表中的三个进程id分别为30211、30443、30486,这说明我们的应用成功的使用了多进程技术,那么我们可以发现开启Android应用的多进程模式是不是很简单呢?但这仅仅只是开始,实际的使用中还是会有很多问题需要处理的.
    查看应用进程的方法:
    可以在IDE的DDMS视图中直接查看进程信息,也可以使用命令行来进行查看,命令为:adb shell ps或者 adb shell ps | grep com.siqi.pisces.
    其中"com.siqi.pisces"是应用的包名.
    不知道大家有没有注意到,SecondActivity和ThirdActivity的android:process属性分别为":second"和"com.siqi.pisces",那么这两种方式有区别么?
    其实是有区别的,区别有两方面:
    首先,":"的含义是指要在当前的进程名前面附加上当前的包名,这是一种简单的写法,对于SecondActivity来说,它的完整的进程名为"com.siqi.pisces:second",这一点通过上图也能看出来,而对于ThirdActivity中的声明方式,它是一种完整的命名方式,不会附加包名信息;
    其次,进程名以":"开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以":"开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中.
    我们知道Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据.这里要说的是,两个应用用过ShareUID跑在同一个进程中是有要求的,需要这两个应用具有相同的ShareUID并且签名相同才可以.在这种情况下,它们可以互相访问对方的私有数据,比如data目录,组件信息等,不管它们是否跑在同一个进程中.当然,如果它们跑在同一个进程中,那么除了能共享data目录,组件信息,还可以共享内存数据等等,也可以简单的把它们想成一个应用的两个部分.

    未完待续...

    相关文章

      网友评论

        本文标题:Android进程间通信

        本文链接:https://www.haomeiwen.com/subject/qxjboftx.html