android 进程间通信

在一个android APP中,如果有占用内存比较大的操作,我们一般使用进程拆分。比如说对于Webview,图库等,由于存在内存系统泄露或者占用内存过多的问题,我们可以采用单独的进程。不仅如此,我们在一个app中可能会访问其他app的信息。因此,此时就需要用到进程通信。

android中进程种类

系统强制销毁进程时,面临一个问题:系统当中可能会运行多个进程,销毁哪些合适呢?这就是我们要讨论的进程优先级问题。进程被系统强制销毁时,是按照进程的优先级进行的。而进程的优先级主要和应用包含的组件相关。进程优先级从高到底可分为四种:前台进程、可视进程、服务进程、缓存进程

  • 前台进程

需要用户当前正在进行的操作。一般满足一下条件:
1、屏幕顶层运行Activity,用户正与之交互。
2、有BroadcastReceiver正在执行代码
3、有Service在其回调方法(onCreate(),onStart(),onDestroy())中正在执行代码。
这种进程较少,一般来作为最后的手段来回收内存。

  • 可视进程

做用户当前意识到的工作,一般满足以下条件:
1、屏幕上显示Activity,但不可操作(处于onPause()状态),比如说该activity上面有个透明的activity,或者有个dialog。
2、有service通过调用Service.startForeground()作为一个前台服务运行
3、含有用户意识的特定的服务,如动态壁纸、输入法等。
这些进程很重要,一般不会杀死,除非这样做可以使得所有前台进程存活。

服务进程:含有以startService()方法启动的service。虽然该进程用户不直接可见,但是他们一般做一些用户关注的事情(如数据的上传下载)
这些进程一般不会杀死,除非系统内存不足以保持前台进程和可是进程的运行。

对于长时间运行的service(如30分钟以上),系统会考虑将之降级为缓存进程,避免长时间运行导致内存泄露或其他问题,占用过多RAM以至于系统无法分配充足资源给缓存进程。

  • 缓存/后台进程

包含多个activity实例,但是都不可见(处于onStop且已返回)
系统如有内存需要,可随意杀死。

android 几种进程通信的方式

跨进程通信要求把方法调用及数据分解至操作系统可以识别的程度,并将其从本地进程传输至远程进程。然后在远程进程汇总重新组装并执行该调用。
然后,返回值将沿相反的方向传输回来。

android为我们提供了以下几种进程机制:

  • 文件

  • Socket

  • Messenger(基于Binder)

  • ContentProvider(基于Binder)

  • AIDL

基于Messenger的进程通信

This allows for the implementation of message-based communication across processes

运行实现基于消息的进程间通信方式。

如下图:
这里写图片描述

可以看到,我们可以在客户端发一个Message给服务器,在服务器端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成message,发送给客户端,客户端的handler中会接收到处理的结果。

此外,记录客户端对象的Messenger,可以实现一对多通信。

Note:每一个Messenger是和Handler一一对应的,因而,所有的任务都将在handler所在的线程中串行执行。但是对于AIDL来说,任务可以在binder 线程上面并行执行。

代码示例:https://download.csdn.net/download/u011337574/10404003

基于AIDL的进程间通信

AIDL的全称为android Interface definition language,顾名思义它是一种android内部进程通信接口的描述语言,是android进程间通信的桥梁。

什么时候使用AIDL

只有当你允许篮子不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL,其他情况下你可以选择其他方法,如使用Messager。可见AIDL是处理多线程、多客户端并发访问的。而Messager是单线程处理。

示例代码:https://download.csdn.net/download/u011337574/10404023

如何选择这几种通信方式

这里写图片描述

  • 只有允许不同应用的客户端用IPC方式调用远程方法,并且想要在服务中处理多线程时,才有必要使用AIDL。

  • 如果需要调用远程方法,但不需要处理并发IPC,就应该通过实现一个Binder创建接口。

  • 如果你想执行IPC,但只是传递数据,不涉及方法调用,也不需要高并发,就使用Messenger来实现接口。

  • 如果需要处理一对多的进程间数据共享(主要是数据CRUD),就使用ContentProvider

  • 如果要实现一对多的并发实时通信,就使用Socket。

猜你喜欢

转载自blog.csdn.net/u011337574/article/details/80249816
今日推荐