Android多进程使用总结

使用多进程
  1. ApplicationActivityServiceReceiverProvider均支持 android:process 属性,值以冒号开头,该进程就是私有进程,反之就是公有进程
  2. 通过 JNI,生成子进程。(一般用于 daemon 进程,来实现防杀,保活等效果)

进程级别
  1. 前台进程
    1.1 进程包含正与用户交互的 Activity
    1.2 进程包含 Service,且 Service 绑定到正与用户交互的 Activity
    1.3 进程包含在前台运行的 Service
    1.4 进程包含正执行一个生命周期回调的 Service
    1.5 进程包含正执行其 onReceive() 方法的 BroadcastReceiver
  2. 可见进程(被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。)
    2.1 进程包含不在前台、但仍对用户可见的 Activity
    2.2 进程包含绑定到可见 ActivityService
  3. 服务进程(除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。)
    3.1 进程包含已使用 startService() 方法启动的服务且不属于上述两个更高类别进程的进程。
  4. 后台进程
    4.1 进程包含目前对用户不可见的 Activity
  5. 空进程
    5.1 不含任何活动应用组件的进程。用于缓存以便下次启动迅捷。

注:

  1. 系统会对进程评定为它能达到的最高级别,如进程 A同时满足前台进程和可见进程的条件,则进程 A为前台进程。
  2. 服务于另一进程的进程其级别永远不会低于其所服务的进程。 例如,进程 A进程 B 提供服务,则进程 A 始终被视为至少与进程 B同样重要。(大于或等于)

杀进程

当内存不足以分配时,就会根据进程级别以及占用内存大小清除进程。


使用场景
  1. 常驻后台任务应用。(具体看下面例子)
  2. 多进程开发能为应用解决了OOM问题,Android对内存的限制是针对于进程的,这个阈值可以是48M、24M、16M等,视机型而定,所以,当我们需要加载大图之类的操作,可以在新的进程中去执行,避免主进程OOM
  3. 更有效、合理的利用内存。我们可以在适当的时候生成新的进程,在不需要的时候及时杀掉,合理分配,提升用户体验。减少系统被杀掉的风险。
  4. 多进程还能带来一个好处就是,单一进程崩溃并不影响整体应用的使用。

例子:播放音乐
A. 在 Activity 中直接播放音乐。(在 Activity 操作不好)
B. 启动后台 Service,播放音乐。(较 A 没什么区别,只是不知 Activity 操作)
C. 启动前台 Service,播放音乐。(单进程最好办法)
D. 在新的进程中,启动后台 Service,播放音乐。(多进程最优雅办法,保留系统调度的能力)
E. 在新的进程中,启动前台 Service,播放音乐。(多进程最好办法)


注意事项
  1. 静态变量和单例模式完全失效。
    因为进程间,内存空间是相互独立的,所以VM方法区内的静态变量也都是相互独立的。
  2. 线程同步机制完全失效。
    由于Java的同步机制是VM来进行调度的,两个进程拥有两个不同的VM,所以,同步也会在多进程开发中失效。
  3. Application会多次创建
    每个新进程在创建的时候,都会新建一个Application。可以根据进程名来区分不同的进程,进行不同的初始化,同时,不要在Application中设置过多的静态变量,导致内存增加。

结语

参考文章写得相当好,这里只是简单记录一下笔记,感谢原作者。


以上总结参考自

  1. Android多进程介绍
  2. Android多进程使用场景
  3. Android多进程注意事项
    更加详细请查看原文

你可能感兴趣的:(Android多进程使用总结)