3.1 Android应用程序的生命周期

Android应用程序生命周期指从启动到终止的全过程,应用程序的生命周期是由Android系统进行调度和控制,而不是由应用程序直接控制的。

Android应用程序组件有其生命周期,指从创建到销毁的全过程,组件会在可见、不可见、活动、不活动等状态中不断变化,Activity组件是Android应用生命周期的重要部分之一。

1.进程

进程(Process)是程序的一次执行,进程由程序、数据和进程控制块构成,进程是一个可拥有资源的独立实体,又是一个可以独立调度的基本单位。

进程的执行过程包括创建(New)、就绪(Ready)、执行(Running)、阻塞(Blocked)、挂起(Suspend)、终止(Terminated)等状态。

在Android操作系统中,进程是应用程序的具体实现。组件运行的进程由Androidmanifest文件控制。组件标签<activity>、<service>、<receiver>、<provider>等包含一个process属性,这个属性可以设置组件运行的进程。<application>标签也包含process属性,用来设置程序中所有组件的默认进程。所有的组件在默认进程的主线程中实例化,系统对这些组件的调用从主线程中分离。

每个Android应用程序的进程都是由Android进行时独立管理的,每个Android的应用程序在自己的进程中运行。

Android系统往往运行在资源受限的平台上,资源管理非常重要,因此,由Android系统管理资源。

Android系统的进程优先级从高到低分别为:前台进程、可见进程、服务进程、后台进程、空进程。前台进程为高优先级、可见进程、服务进程为中优先级、后台进程、空进程为低优先级。

1)前台进程

前台进程是Android系统中最重要的进程,它是与用户进行交互的进程。

前台进程包括:

  • 该进程拥有一个正在与用户交互的Activity()(其onResume()方法被调用)。
  • 该进程拥有一个绑定到正与用户交互的Activity上的Service。
  • 该进程拥有一个前台运行并调用了startForeground()方法的Service。
  • 该进程拥有一个正在执行的回调方法(如onStart()、onCreate()、onDestroy())的Service。
  • 该进程拥有一个正在执行onReceive()方法的BroadcastReceiver对象。

通常在任何时间点,只有很少前台进程存在。当出现资源不足时,也会“杀死”部分前台进程。

2)可见进程

可见进程是用户能够在屏幕上看见,但不能与用户进行交互,不响应界面事件的进程。

可见进程包括:

  • 该进程拥有一个不在前台但为用户可见的Activity(如调用了方法onPause()之后)。
  • 一个可见的Activity所绑定的Service。

当出现无法维持前台进程运行等情况时,才会清除可见进程。

3)服务进程

包含已启动服务的进程称为服务进程。服务进程不可见,不与用户直接交互,但能在后台运行,提供用户需要的功能。

服务进程包括:

  • 一个由startService()方法启动的Service。
  • 支持正在处理的不需要可见界面运行的Service。

当系统内存不足,不能维持前台进程和可见进程的运行时,才会清除服务进程。

4)后台进程

不包含任何已启动服务,而且没有用户可见的Activity的进程,即为后台进程。

后台进程包括:

  • 该进程拥有一个当前不可见的Activity(已调用了onStop()方法)。
  • 目前没有服务的Service。

一般情况下,存在较多的后台进程,当系统资源紧张时,Android将会使用LRU模式来清除最近最少使用的后台进程。

5)空进程

空进程是不包含任何Activity组件,对用户没有任何作用的进程。

为了改善系统的整体性能,Android通常在内存中保留生命周期结束了的应用,当系统资源紧张时,空进程首先被清除。

2.线程

线程(Thread)是进程中的一个实体,是被系统独立调度的基本单位。线程基本上不拥有系统资源,只有一些在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但它可共享所属进程的全部资源。

引入线程的目的是为了减少程序并发执行时所付出的时空开销,使操作系统具有更好的并发性,提高系统运行的效率。线程具有许多传统进程所具有的特征,又称为轻量级进程(Light-Weight Process),而把传统的进程称为重量级进程(Heavy-Weight Process)。

每个进程有一到多个线程运行在其中。进程中的所有组件都在UI线程中实例化,以保证应用程序是单线程的,除非应用程序又创建了自己的线程,例如网络连接、下载或其他费时操作。线程通过Java的Thread类创建。