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

Android应用进程的生命周期

2017-08-12 23:58 176 查看

前言

在Android系统中,一个应用进程的生命不是由应用自己直接控制的,而是由系统决定的。系统根据应用运行的组件、对用户的重要程度和系统当前可用内存的大小共同决定一个应用进程的生命。了解不同的应用组件(特别是Activity、Service和BroadcastReceiver)如何影响应用进程的生命,对于一个Android开发人员来说极其重要。没有正确地使用这些组件可能会造成应用进程在执行重要工作时被系统杀死。

基础知识

默认情况下,同一个应用的所有组件在相同的进程和线程(主线程)中运行。如果需要指定某个组件应在哪个进程中运行,那么可以在AndroidManifest.xml文件中设置该组件的android:process属性。

当系统内存不足,而其它为用户提供更紧急服务的进程又需要内存时,Android系统会决定杀死某些进程。系统会权衡进程对用户的相对重要程度来决定杀死哪些进程。例如,相对于有一个可见Activity的进程,系统更有可能杀死有一个不可见Activity的进程。因此,是否杀死某个进程也取决于该进程中运行组件的状态。

进程的生命周期

为了决定当系统内存不足时应该杀死哪些进程,Android系统会根据进程中正在运行的组件以及这些组件的状态,将每个进程放入一个“重要性等级”中。按照重要程度从高到低,这些进程类型分别是:

前台进程 用户当前操作所必需的进程。不同组件所在的进程被视为是前台进程的方式不相同。如果一个进程满足以下任一条件,可以视为前台进程。

正在运行一个处于屏幕前台正与用户交互的Activity(Activity的onResume()方法已被调用)。

有一个正在运行的BroadcastReceiver(BroadcastReceiver的onReceive()方法正在执行)。

有一个正在执行生命周期回调的Service(onCreate()、onStart()或者onDestroy()方法)。

通常,系统中前台进程并不多。只有在内存太少以至于不能维持这些进程继续运行这万不得已的情况下,系统才会杀死这些进程。一般这个时候设备已经处于内存分页状态,因此需要杀死一些前台进程来确保用户界面的正常响应。

可见进程 执行那些用户可见工作的进程。如果系统杀死这些进程,那么会对用户的体验造成显而易见的消极影响。如果一个进程满足以下任一条件,可以视为可见进程。

正在运行一个不在前台,但是对用户可见的Activity(Activity的onPause()方法已被调用)。例如,前台Activity以对话框的形式显示,前一个Activity在背后可见。

有一个通过调用Service.startForeground()方法(请求系统以可见的方式运行Service)以前台Service的形式运行的Service。

有一个用户可以意识到的、系统用于特定功能的Service。例如,活动的壁纸、输入法服务等。

可见进程被视为是极其重要的进程,除非为了维持所有前台进程的运行,否则系统不会杀死这些进程。

服务进程 有一个以startService()方法启动的Service且不属于前台进程和可见进程的进程。尽管这些进程不是直接对用户可见,但是它们通常在执行一些用户关心的任务(例如,后台上传或者下载网络数据)。因此,除非内存不足以维持所有前台进程和可见进程的运行,否则系统会保留这些进程。

那些运行了一段时间的Service(比如30分钟或者更久)的重要性可能被降级,以允许它们的进程被缓存在LRU(最近最少使用)列表中。这样可以避免那些有内存泄露或者其它问题造成的大量内存消耗但是长时间运行的Service阻止系统更有效的使用缓存进程的场景。

缓存进程 不包含任何活动的组件的进程。例如,有一个或者多个当前对用户不可见的Activity(Activity的onStop()方法已经被调用并且返回了)的进程。缓存这些进程的目的是缩短下次运行该进程的组件所需要的时间。缓存进程不是当前所必需的,所以当系统的其它地方需要内存时这些进程往往被杀死。

缓存进程被缓存在一个LRU(最近最少使用)列表中。回收内存时,列表中最后一个进程将会第一个被杀死。排列这个列表的具体策略与平台具体的实现细节有关,但是通常会尽力保留那些更有用的进程(例如,用户home应用的进程、用户最后看到的Activity的那个进程)。

根据进程中当前活动组件的重要程度,系统会将进程分类为它可能达到的最高等级。例如,如果某进程同时拥有启动的Service和可见的Activity,那么系统会将这个进程分类为可见进程,而不是服务进程。

另外,一个进程的重要性等级可能会因为其它进程对它的依赖而变高,即服务于另一进程的进程其重要性等级不会低于其所服务的进程。例如,如果进程A绑定到进程B中的Service,或者进程A正在使用进程B的ContentProvider,那么进程B的重要性等级至少与进程A一样。

总结

在Android系统中,一个应用进程的生命不是由应用自己直接控制的,而是由系统决定的。系统根据应用运行的组件、对用户的重要程度和系统当前可用内存的大小共同决定一个应用进程的生命。

运行Service的进程的重要性等级高于运行对用户不可见的Activity的进程,因此最好为长时间执行任务的Activity启动Service,而不是简单的创建线程,当任务有可能比Activity的生命更加持久时更要如此。同理,BroadcastReceiver也应该使用Service,而不是简单地将耗时的任务放入线程中。

参考

https://developer.android.com/reference/android/os/Process.html

https://developer.android.com/guide/components/processes-and-threads.html

https://developer.android.com/guide/topics/processes/process-lifecycle.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android