使用多进程
-
Application
、Activity
、Service
、Receiver
和Provider
均支持 android:process 属性,值以冒号开头,该进程就是私有进程
,反之就是公有进程
- 通过
JNI
,生成子进程。(一般用于 daemon 进程,来实现防杀,保活等效果)
进程级别
- 前台进程
1.1 进程包含正与用户交互的Activity
。
1.2 进程包含Service
,且Service
绑定到正与用户交互的Activity
。
1.3 进程包含在前台运行的Service
。
1.4 进程包含正执行一个生命周期回调的Service
。
1.5 进程包含正执行其onReceive()
方法的BroadcastReceiver
。 - 可见进程(被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。)
2.1 进程包含不在前台、但仍对用户可见的Activity
。
2.2 进程包含绑定到可见Activity
的Service
。 - 服务进程(除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。)
3.1 进程包含已使用startService()
方法启动的服务且不属于上述两个更高类别进程的进程。 - 后台进程
4.1 进程包含目前对用户不可见的Activity
。 - 空进程
5.1 不含任何活动应用组件的进程。用于缓存以便下次启动迅捷。
注:
- 系统会对进程评定为它能达到的最高级别,如
进程 A
同时满足前台进程和可见进程的条件,则进程 A
为前台进程。 - 服务于另一进程的进程其级别永远不会低于其所服务的进程。 例如,
进程 A
为进程 B
提供服务,则进程 A
始终被视为至少与进程 B
同样重要。(大于或等于)
杀进程
当内存不足以分配时,就会根据进程级别以及占用内存大小清除进程。
使用场景
- 常驻后台任务应用。(具体看下面例子)
- 多进程开发能为应用解决了
OOM
问题,Android对内存的限制是针对于进程的,这个阈值可以是48M、24M、16M等,视机型而定,所以,当我们需要加载大图之类的操作,可以在新的进程中去执行,避免主进程OOM
。 - 更有效、合理的利用内存。我们可以在适当的时候生成新的进程,在不需要的时候及时杀掉,合理分配,提升用户体验。减少系统被杀掉的风险。
- 多进程还能带来一个好处就是,单一进程崩溃并不影响整体应用的使用。
例子:播放音乐
A. 在 Activity
中直接播放音乐。(在 Activity
操作不好)
B. 启动后台 Service
,播放音乐。(较 A 没什么区别,只是不知 Activity
操作)
C. 启动前台 Service
,播放音乐。(单进程最好办法)
D. 在新的进程中,启动后台 Service
,播放音乐。(多进程最优雅办法,保留系统调度的能力)
E. 在新的进程中,启动前台 Service
,播放音乐。(多进程最好办法)
注意事项
- 静态变量和单例模式完全失效。
因为进程间,内存空间是相互独立的,所以VM方法区内的静态变量也都是相互独立的。 - 线程同步机制完全失效。
由于Java的同步机制是VM来进行调度的,两个进程拥有两个不同的VM,所以,同步也会在多进程开发中失效。 -
Application
会多次创建
每个新进程在创建的时候,都会新建一个Application
。可以根据进程名来区分不同的进程,进行不同的初始化,同时,不要在Application中
设置过多的静态变量,导致内存增加。
结语
参考文章写得相当好,这里只是简单记录一下笔记,感谢原作者。
以上总结参考自
- Android多进程介绍
- Android多进程使用场景
-
Android多进程注意事项
更加详细请查看原文