总结Android应用开发基础知识中的应用和Application类。
应用
Android 应用的生命周期由系统控制,包括三个阶段:启动、运行和结束。每个阶段会触发Application 对象中对应的回调方法。
应用的启动
通过Launcher启动App的流程:
- Launcher进程请求SystemServer进程创建Activity。
- SystemServer进程解析Intent等,并检查目标APP进程是否存在,不存在则去创建进程。
- SystemServer进程通过Socket方式请求Zygote进程创建APP进程,返回进程号等信息。
- App进程入口为
ActivityThread.main()
方法,执行此方法,初始化进程并请求SystemServer绑定App进程。绑定进程的工作包括,一,通知App进程去启动Application;二,通知APP进程去启动Activity。
总结:当用户点击应用图标的时候,系统会去检测进程是否存在,如果不存在,则通过Zygote创建进程,创建完进程后,则需要将进程与App进行绑定,将App的资源加载到内存中,当加载完毕,各种条件准备就绪,接下来就是启动Application和Activity了,如此,App的界面就展示出来了。
应用的销毁
每个 Android 应用都在各自的 Linux 进程中运行,应用进程的终止由系统通过综合因素来决定。因素包括:当前运行的应用、应用对用户的重要程度、系统的可用内存等。
当系统内存过低时,会根据不同进程的优先级进行内存回收。系统根据进程的状态,将进程分为四个等级:
前台进程(Foreground Process)
前台进程是优先级最高的进程,用户当前操作交互的必须是前台进程。当一个进程包含以下条件的时候,可以认为是前台进程。
- 用户正在交互的,处在屏幕最上层的
Activity
(onResume
被调用过后)。 - 包含一个正在运行的
BroadcastReceiver
(onReceive
正在执行)。 - 包含一个正在运行它的回调(
onCreate
、onStart
、onDestroy
)的Service
。
在一般状况下,杀死前台进程需要用户交互。当被系统杀死的时候,说明此时系统连该进程所需要的内存都无法满足,是最后才被杀死的。
可见进程(Visible Process)
可见进程是当前用户关心但是杀掉它会显著的影响用户体验的进程。当包含如下情况时,该进程可以被当做可见进程。
- 包含一个对用户可见但不在前台(
onPause
被调用过后)的Activity
。 - 包含一个通过
startForeground
启动,正在运行的作为前台Service
的进程。 - 包含一些用户可感知的特定需求的
Service
,例如动态壁纸、输入服务等。
可见进程一般不会被销毁,除非是为了保证所有前台进程的运行,而不得不杀死可见进程。
服务进程(Service Process)
服务进程是包含用startService
所创建Service
的进程。这类进程对用户不是直接可见,但是用户会关心的,例如后台上传服务等等。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可见进程的运行需要。
当Service
运行了很长的时间,例如超过30分钟,系统就会对其降级,以使该进程会被更容易的回收。
缓存进程(Cached Process)
缓存进程是当前不被需要的进程,因此系统可以在任何需要内存的时候,释放掉它们的内存。
这类进程通常包含一个或多个当前不可见(onStop
被调用)的Activity
实例。当系统杀掉这类进程的时候,不会影响用户的体验。
LMK进程管理
关于进程的管理,首先需要知道Low Memory Killer(LMK)这个概念。它是基于Linux的Out of Memory Mechanism(OOM机制)改进而来的。LMK是一个内核层组件,是一个进程杀手。它的主要作用是在系统低内存状态时,释放掉那些不太重要进程的内存,让系统更加流畅。
每一个进程根据其重要性,都包含一个oom_adj值,AMS会去动态的更新oom_adj这个值。当系统处在低内存状态时,LMK会根据oom_adj这个值,去杀死相关的进程。oom_adj值得范围是-17~15,一个进程的oom_adj值越高,它被杀死的概率就越大。
整个过程就是AMS更新oom_adj值,LMK去挑选并杀死进程。
Application
维护全局的应用状态的基类
Base class for maintaining global application state.
1 | public class LifeCycleApplication extends Application { |