您的位置:首页 > 移动开发 > Android开发

Android 多进程基础知识整理

2016-12-24 15:14 435 查看
多进程设计需求

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 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息