打开设置--应用与服务(不同机型进入方式可能不同),你就会看到当前正在运行的进程和服务,也就是目前正在“后台运行”的任务。列表中有你刚刚使用过的 APP ,也有一两小时前打开过的 APP。还有一些软件你甚至不知道自己什么时候打开过(其实根本就不是自己打开的),或者记得自己已经“关闭”了,但它们也在列表中,消耗着你的手机资源。列表中有一些条目名字很奇怪,一般人看不懂,但还是觉得“它很重要”,不敢轻易强制关闭。这个列表展示的内容和普通的后台管理界面不太一样,感觉稍稍有些神秘,然而这又是我们日常使用所回避不了的一部分。
作为一名资深的手机用户(我相信人人都是),是时候该解决这类疑问了。这一切都要从人与宇宙的关系。。。咳咳。。手机进程的概念开始说起。
什么是进程
在开发文档中是这么说的:当一个应用程序启动时(仅仅只是“启动时”,并不一定有组件运行),就会产生一个进程。在这个进程中同时会创建一个主线程,使应用内的任务开始执行。Android系统总是尽可能地保留进程。举个例子,当你打开qq时,进程创建(同时创建主线程),随后各种内容加载(首先是活动,然后是各种控件什么的)。当你完成操作时,一般都会按后退键(back),直至退出程序。
这里需要注意,一般情况下我们一直按后退是希望应用程序关闭的。然而事实上这样做只是关闭了界面(活动),大多数app的“进程”仍会保留(少数良心app可以设置在退出时“完全关闭”),占用内存以进行后台任务。进程随应用启动而产生,但往往并不随着应用的“关闭”而关闭
所以很多时候我们看上去关闭了程序,但其实它仍在后台运行!(此处请自行回忆那些困扰你的流氓软件们)。不过不必担心,Android 系统自有一套进程管理机制来帮你管理后台任务。系统会根据应用的重要程度把所有进程划归为几个等级,最不重要的进程将会被优先关闭,相对重要的进程将获得资源来保留。
那么问题来了----到底如何分辨哪些进程重要而哪些不重要呢?
五种进程优先级:
系统当然要保证用户体验,所以重要等级的划分原则就是要首先满足用户当前的需求:用户正在使用的当然不能关闭,而用户暂时不需要的,相对的就没那么重要了。
1.Foreground process 前台进程:也就是用户正在进行操作的进程。这样的进程优先级(优先保留)最高,最不容易销毁,因为它表现在屏幕上,直接同用户进行交互,所以只有当内存资源极度紧张等一些其他极端情况才会关闭,表现为“闪退”。我用的第一台 Android 手机运行内存(RAM)只有 290M,多任务时经常内存不足导致程序“闪退”。这手机我竟然用了两年,现在想想都佩服我自己hhhh。
不只是界面交互,如果应用程序中的服务(service)组件正在进行一些操作或者广播接收者(BroadcastReceiver)在执行接收广播的操作(onReceive)时,该进程仍被视为前台进程。
2.Visible process 可视进程:顾名思义,就是仍然在屏幕上有显示,但用户不再能直接与它交互的程序。比如当在应用中打开下滑菜单时(有些下滑菜单是透明的),用户能“看得到”,但是“摸不着”。优先级仅次于前台进程。
3.Service process 服务进程:该进程中开启了一个服务(通过startService方法)。注意这里强调的是服务的“开启”,区别于第一类中的“服务正在执行一些操作”。大多数音乐软件都是通过这种方法来保留其播放音乐的进程。
4.Background process 后台进程:当你按下 HOME 键或 BACK 键时,手机退回主界面,此时应用程序不再可见,转入后台运行。如果如果不满足前几类的条件,这个进程就会被判定为后台进程。
5.Empty process 空进程:A process that doesn't hold any active application components.没有任何组件在运行,包括活动界面(Activity)。事实上用户已经不再需要这个进程了,但出于 Android 系统“尽可能保留进程”的原则,这样的进程出现后不会被立即销毁。保留进程的唯一理由,就是为了下次开启这个应用时能快一些。其实现在的手机硬件性能足够好,这样的缓存对于用户体验的提升效果不怎么明显。这样的进程最不重要,将首先被销毁。
也许你已经注意到了,在屏幕上正在显示的或者正在服务于用户的进程的重要等级是比较高的,这是出于对用户体验的考虑-----谁会接受在自己打王者荣耀的时候游戏突然闪退呢?大多数情况下,一个应用程序的组件成分都会比较复杂,这个进程可能同时满足多个级别的划分条件。在这种情况下,它会被尽可能地划为能够达到的最重要等级。
饱受诟病的“全家桶”
如果你的手机上安装了好几个同一家公司推出的 APP(比如企鹅系、头条系等),那么当你启动其中之一时,剩下的几款 APP 大概率也会被唤醒(视软件的流氓程度而定)。联动开启的 APP 会大大占用内存,让手机变得卡顿。并且它们许多都需要联网服务,占用网速,有些还会在你不知情(因为你并没有直接开启或使用它们)的情况下监控你的数据并上传。
不过,你以为这就完了?
事实上,如果不手动清除,这样的进程很难被系统关闭,它们会一直长期运行。这些进程大多属于第三或第四等级,然而如果不同 APP 中的组件构成“相互依赖”的关系,它们所属进程的保留优先级就会提高,也就越不容易被关闭。(我等流氓软件可不是浪得虚名的ε=ε=ε=( ̄▽ ̄))
超级管家
尽管 Android 想要尽可能的保存所有的进程,但是并非所有的内存都会被用于维持进程。比如系统运行会占用相当的内存,系统也需要留出一部分闲置内存用以处理新事件。Android 的管理让内存的分配处于一种“动态平衡”中,以保障各项任务都能尽可能的稳定、高效地执行。
好了,关于进程的管理就暂时说到这了。众所周知,Android 系统是一个复杂的机体,它管理着手机硬件和软件,让它们尽可能的配合,提供给用户最好的服务。这次只是简单介绍了进程管理机制,今后我也会尽量用通俗的语言从系统上去解释那些平常看上去似是而非的问题,期待你的关注!