专栏名称: 复利大王
分享和推送Java/Android方向的技术和文章,让你成为这方面的大牛,让你每天都成长一点。同时,我们也会邀请BAT的大牛分享原创!
目录
相关文章推荐
复利大王  ·  北京97师大美女征友 ·  7 小时前  
复利大王  ·  青岛大所女律师cg事件 ·  7 小时前  
复利大王  ·  某国资PE:月入6k你玩什么命啊! ·  昨天  
复利大王  ·  满级英语翻译,看完笑的肚子疼!哈哈 ·  昨天  
复利大王  ·  坏了!突然被老板表白了 ·  2 天前  
51好读  ›  专栏  ›  复利大王

如何巧用Android多进程,你不知道的点全总结!微信,微博等主流App都在用

复利大王  · 公众号  · android  · 2017-07-20 07:43

正文

请到「今天看啥」查看全文



  • 使用文件共享方式,多进程读写一个相同的文件,获取文件内容进行交互;


  • 使用Messenger,一种轻量级的跨进程通讯方案,底层使用AIDL实现(实现比较简单,博主开始本文前也想了一下是否要说一下这个东西,最后还是觉得没有这个必要,Google一下就能解决的问题,就不啰嗦了);


  • 使用AIDL(Android Interface Definition Language),Android接口定义语言,用于定义跨进程通讯的接口;


  • 使用ContentProvider,常用于多进程共享数据,比如系统的相册,音乐等,我们也可以通过ContentProvider访问到;


  • 使用Socket传输数据。


  • 接下来本文将重点介绍使用AIDL进行多进程通讯,因为AIDL是Android提供给我们的标准跨进程通讯API,非常灵活且强大(貌似面试也经常会问到,但是真正用到的也不多…)。上面所说的Messenger也是使用AIDL实现的一种跨进程方式,Messenger顾名思义,就像是一种串行的消息机制,它是一种轻量级的IPC方案,可以在不同进程中传递Message对象,我们在Message中放入需要传递的数据即可轻松实现进程间通讯。但是当我们需要调用服务端方法,或者存在并发请求,那么Messenger就不合适了。而四大组件传递Bundle,这个就不需要解释了,把需要传递的数据,用Intent封装起来传递即可,其它方式不在本文的讨论范围。


    下面开始对AIDL的讲解,各位道友准备好渡劫了吗?


    5

    使用AIDL实现一个多进程消息推送

    像图片选择这样的多进程需求,可能并不需要我们额外编写进程通讯的代码,使用四大组件传输Bundle就行了,但是像推送服务这种需求,进程与进程之间需要高度的交互,此时就绕不过进程通讯这一步了。
    下面我们就用即时聊天软件为例,手动去实现一个多进程的推送例子,具体需求如下:


    1. UI和消息推送的Service分两个进程;


    2. UI进程用于展示具体的消息数据,把用户发送的消息,传递到消息Service,然后发送到远程服务器;


    3. Service负责收发消息,并和远程服务器保持长连接,UI进程可通过Service发送消息到远程服务器,Service收到远程服务器消息通知UI进程;


    4. 即使UI进程退出了,Service仍需要保持运行,收取服务器消息。


    6

    实现思路

    先来整理一下实现思路:

    1. 创建UI进程(下文统称为客户端);


    2. 创建消息Service(下文统称为服务端);


    3. 把服务端配置到独立的进程(AndroidManifest.xml中指定process标签);


    4. 客户端和服务端进行绑定(bindService);


    5. 让客户端和服务端具备交互的能力。(AIDL使用);


    7

    例子具体实现

    为了阅读方便,下文中代码将省略非重点部分,可以把本文完整代码Clone到本地再看文章:

    https://github.com/V1sk/AIDL


    Step0. AIDL调用流程概览


    开始之前,我们先来概括一下使用AIDL进行多进程调用的整个流程:


    1. 客户端使用bindService方法绑定服务端;


    2. 服务端在onBind方法返回Binder对象;


    3. 客户端拿到服务端返回的Binder对象进行跨进程方法调用;

    整个AIDL调用过程概括起来就以上3个步骤,下文中我们使用上面描述的例子,来逐步分解这些步骤,并讲述其中的细节。


    Step1.客户端使用bindService方法绑定服务端


    1.1 创建客户端和服务端,把服务端配置到另外的进程


    1. 创建客户端 -> MainActivity;


    2. 创建服务端 -> MessageService;


    3. 把服务端配置到另外的进程 -> android:process=”:remote”


    上面描述的客户端、服务端、以及把服务端配置到另外进程,体现在AndroidManifest.xml中,如下所示:

    开启多进程的方法很简单,只需要给四大组件指定android:process标签。


    1.2 绑定MessageService到MainActivity


    创建MessageService:

    此时的MessageService就是刚创建的模样,onBind中返回了null,下一步中我们将返回一个可操作的对象给客户端。

    客户端MainActivity调用bindService方法绑定MessageService


    这一步其实是属于Service组件相关的知识,在这里就比较简单地说一下,启动服务可以通过以下两种方式:







    请到「今天看啥」查看全文