进阶之路-多进程-进程基础

149 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

进程

进程是一个操作系统动态执行的基本单元,通俗的讲我们的一个应用就是一个进程,一个进程对应一个虚拟机实例,使用的是系统为该虚拟机分配的堆内存。

android应用程序可以在清单文件的application节点设置largeheap="true"属性来标记使用最大的内存

进程和线程

线程是进程的子集,一个进程可以有多个线程。

Android 进程模型

对于Linux来说标记一个给定用户是会分配一个用户ID,在Android中是将用户ID用于标记应用程序,当应用程序被安装到硬件设备时便会分配用户ID,只要不被卸载用户ID都是不会发生变化的。同时系统会对其进行权限设置,保证应用间数据和资源不混乱。

默认情况下,当应用被运行时,系统会根据其用户ID启动一个虚拟机实例,数据通信等操作都是在该虚拟机之内完成的。但是也会存在一个虚拟机当中有多个应用,需要使用相同的秘钥签名应用,并且在清单文件的manifest节点设置android:shared = "android share id"

Android 进程的创建

  1. idle进程启动
  2. init进程启动
  3. zygote进程启动
  4. system_server进程启动
  5. app进程启动

Android 进程的等级(生命周期)

应用进程的生命周期是有操作系统控制,由众多因素共同确定,根据其重要性进行划分。系统会尽可能的保持应用进程,但会由于创建新进程或运行重要性高的进程需要清除重要性低的进程来回收内存。系统会根据进程运行的组件和组件状态将每个进程放入“重要性层次结构”中,回收是根据该结构进行。

前台进程

用户当前操作所必需的进程。这样的进程在操作系统中不多,一般系统不会终止这类进程,除非内存无法支持这类进程继续运行。

  • 调用了onResume()之后的Activity
  • 通过bindService()绑定在于正在交互页面的Service
  • 通过调用startForeground()正在执行的前台Service
  • 正在执行 onReceive() 方法的 BroadcastReceiver
  • 正在执行onCreate()onStart()onDestroy()Service

可见进程

用户当前正在进行的任务,终止会影响用户体现,造成明显的负面影响,系统一般轻易不会终止这类进程。相对于前台进程而言,这类进程没有数量上的限制,进程相对受控制。

  • 调用了onPause()Activity
  • 通过bindService()绑定在于可见(或前台)页面的Service

服务进程

尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。

  • 正在运行startService()方法启动的的Service,且不属于上述两个更高类别进程的进程。

后台进程

后台进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在LRU列表中,以确保包含用户最近查看的Activity的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。

  • 调用了onStop()Activity

空进程

保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。

  • 不含任何活动应用组件的进程