Android进阶(三)Android 中的IPC机制(1)

作为Android开发人员,IPC应该是我们能经常听到的。但是什么是IPC?IPC的使用场景是什么?Android中IPC的实现模式有哪几种?这些一连串的问题,也许对于初学者来说就不那么简单了。接下来,让我们一起去详细了解一下这个常用但并不简单的IPC机制。

  IPC是Inter-Process Communication 的简称,翻译过来也就是我们经常提到的跨进程通信。要掌握跨进程通信,我们首先要了解什么是进程,而谈到进程,线程也不可避免的需要了解,这里就放到一起介绍。从操作系统的层面来说,进程是CPU调度的最小的单元。而进程是指一个执行单元,在Android设备中,正常情况下一个进程就是一个应用。一个进程可以包含多个线程,所以说进程和线程的关系是包含和被包含的关系。
  什么情况下会出现多进程呢?通常情况下有以下两种情况:第一种情况是单个应用因为某些原因自身需要采用多进程的模式,这个原因可能就比较多了,比如说有些模块由于特殊的原因需要运行在单独的进程中等。第二种情况就是两个不同的应用之间需要进行数据的传递,此时就只能采用跨进程的方式去获取所需的数据了。

Android中开启多进程的方式

  在Android中如何开启多进程呢,在Android中只有一种方法去开启多进程,那就是在AndroidMenifest文件中给四大组件(Activity、Service、Receiver、ContentProvider)指定android:process属性。下面举例说明:

<activity
    android:name=".Activity1"
    android:process=":remote" />
<activity
    android:name=".Activity2"
    android:process="com.jyn.test.remote" />

  上面的代码为Activity1和Activity2都指定了process属性,并且二者的属性值不同,这就意味着当前的应用又启动了两个新的进程。假设软件的包名为com.jyn.test,当软件运行后,系统会为Activity1创建一个单独的进程,进程名为com.jyn.test:remote;为Activity2创建一个单独的进程,进程名为com.jyn.test.remote.而没有指定process的四大组件,则在默认进程中运行,默认进程名为包名(这里就是com.jyn.test)
  大家应该都注意到了Activity1 和Activity2的android:progress 属性是有所区别的。Activity1的android:process 属性以“:”开头,而Activity2的则没有,那具体的区别是什么呢:“:”的含义是指要在当前的进程名前面加上当前的包名,这是一种简写,所以Activity1完整的进程名是com.jyn.test:remote;对于Activity2中的声明方式是一种完整的命名方式,不会附加包名信息。还有一点区别就是,以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以“:”开头的进程属于全局进程,其他应用是可以和它跑在同一个进程中(通过shareUID的方式)。

开启多进程所引发的问题

从上面的内容中我们不难发现,开启多进程的方法是比较简单的,只需要给四大组件指定android:process属性即可,但实际的开发工作中真的就是如此简单吗?如果直接说多线程的使用并不是如此简单,我相信大多数人都不会信服。那我们还是实践出真理,给一个实际的例子看看,我所说的不仅简单到底体现在什么地方。
  新建两个Activity:TestActivity和SecondActivity,然后我们再新建一个类Project,Project 中有一个public类型的静态成员变量,具体代码如下:

public class Project {
    public static int SIZE = 1024;
}

  随后在TestActivity的onCreate()方法中把SIZE值赋值为2048,在控制台打印这个变量的值,然后启动SecondActivity,在SecondActivity的onCreate()方法中也打印这个变量的值,输出如下。

  由上图可知,这个是正常的,因为静态变量是可以在所有地方共享 的,在TestActivity中改变他的值后,在其他地方访问就是改变后的结果了。
这时我们给SecondActivity添加android:process属性,给SecondActivity重新开启一个进程,看看结果会是怎样的呢,经测试,结果如下所示:

11-08 10:09:12.986 15985-15985/com.jyn.test D/TestActivity: 2048
11-08 10:09:20.971 16146-16146/? D/SecondActivity: 1024

  从日志中我们可以很明显的看出,结果竟然是1024,可是我们的确已经在TestActivity中把SIZE的值重新赋值了啊。由此可以看出使用多进程并非那么的简单。
  我们先解释一下为什么会出现上文中所描述的情况,根本原因我们是知道的,就是因为SecondActivity运行在了另外一个进程中造成的。从系统层面来讲,Android会为每一个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多个副本,就拿上面这个例子来说,在com.jyn.test(默认进程)和com.jyn.test:remote进程中都存在一个Project类,并且这两个类是互不干扰的,在一个进程中修改一个对象的变量值只会影响当前进程,对其他进程是没有影响的,所以才会造成以上的现象。

一般情况下,使用多进程会造成一下几个问题:
1.静态成员和单例模式完全失效。
2.线程同步机制完全失效。
3.SharedPreferences的可靠性下降。
4.Application会多次创建。

  既然使用多进程会出现这么多问题,相应的系统也提供了多种跨进程的通信方法,随后我们将进一步的去学习如何进行跨进程的通信。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容