Android 多进程基础知识整理

多进程设计需求

1. 每个用来运作 Android App 的进程有使用内存的限制(具体限制,每个 Android平台都不太一样,具体限制,可以透过 ActivityManager 的方法取得),当进程过度使用可使用的内存,则会产生 OutOfMemoryError

2. 当机器内存不足时,会按系统优先级进行杀进程的工作,则我们需要一个能在后台持续工作、减少被杀机率、有较高优先级的进程。


Android 进程间通信

Android能进行进程间的通讯方式主要有 intent, messenger,实现 aidl 接口等方式[相关文章1文章2文章3],而 ContentProvider 则可以让不同的进程读写数据。


Android 进程优先级原文在此
优先级一:前台进程( foreground process ),满足下面任一情况,皆为前台进程
1. 有与用户互动中的Activity 运行著。
2. 有和互动中的 Activity绑定的 Service 运行著。
3. 有在前台运行的 Service(执行了 startForeground() )
4. 有Service 正执行生命周期回调(onCreate, onStart 及 OnDestroy )
5. 当有 BroadcastReceiver执行 onReceive() 方法
此类进程只有系统在最后没其它処理方法以降低内存占用时,为了使用户能正常和机器互动才会被移除。

优先级二:可见进程( visible process )
1. 进程有 Activity 不是在前台,但是仍可见( onPause() 已执行 ),比如说 activity 弹起弹窗时。
2. 进程持有和可见 Activity 绑定的 Service。 

优先级三:服务进程( service process )
进程运行一个透过 startService() 启动的 Service 但不是前台或是可见进程 ,比如说听音乐或是下载上传数据。

优先级四:后台进程( background process )
进程运行不可见的 Activity( 比如说 activity 执行了 onStop()  )。一般而言后台进程存在 LRU 链表中以确保常和用户互动的进程最后才被移除。 

优先级五:空进程( empty process )
进程没有任何应用相关的组件。主要是用来当缓存,当下次有组件时需要运行时,能提高启动速度。系统常移除这类进程以平衡进程缓存及内核缓存等系统资源。

一般而言,安卓系统用尽可能高的方试评估该进程优先级,比如说它有可见的 Activity 及 Service 则此时系统视此进程为可见进程,而不是服务进程。

此外,进程的优先级有可能被提高,当有其它的进程依赖它的服务。比如说一个 进程A 运行 Content Provider 提供 进程B 中的组件数据,或一个 Service 在 进程A 中被 进程B中被绑定,则 进程A 的优先级 >= 进程B 的优先级。

因为执行 Service 的服务进程优先级高於后台进程,则比如说需要运行长期不需和用户互动的任务,则选择使用 Service 会比启用一个线程来完成工作要好。比如说,上传相片到云端。


架构设计


在这个设计范例里,我们可以看到几个角色:

1. UI 进程:负责运行和用户互动界面 Activity。(内存占用最大)
2. 数据処理进程:负责数据库的读写,然后透过 Content Provider 做数据的支持工作;上传、下载档案;注册 BroadCastReceiver 等。(内存占用最小)
3. 功能进程:依赖 Content Provider 取得相关数据,加载调用相关的库以処理数据,返回数据処理结果给数据処理进程,并响应 UI进程的请求。(内存占用中)

如此一来,我们将原本需要占用大量内存的单进程应用,分散到三个不同的进程,并且期望数据処理进程能尽可能长驻在系统中,达到我们的需求。


参考文献

refs: https://developer.android.com/guide/components/processes-and-threads.html

refs: https://developer.android.com/topic/performance/memory.html

refs: https://gold.xitu.io/entry/573fd06ead5b95005779faf3

refs: http://www.infoq.com/cn/articles/wechat-android-app-architecture

refs: http://blog.csdn.net/luoshengyang/article/details/47364477

refs: http://www.devtf.cn/?p=69

refs: http://www.cnblogs.com/John-Chen/p/4364275.html

refs: http://www.voidcn.com/blog/ShareUs/article/p-4972270.html

refs: http://blog.csdn.net/u014315849/article/details/51673281

refs: http://blog.csdn.net/luoshengyang/article/details/47364477

refs: http://www.cubrid.org/blog/dev-platform/binder-communication-mechanism-of-android-processes/

refs: https://events.linuxfoundation.org/images/stories/slides/abs2013_gargentas.pdf

refs: http://elinux.org/Android_Binder 




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值