(一)Activity的起源:
Activity是用户交互的第一接口,它提供了一个用户完成指令的窗口。当开发者创建Activity之后,通过setContentView(View)方法来给该Activity指定一个显示的界面,并以为基础提供给用户交互的接口。系统采用Activity栈的方式来管理Activity。
(二) Activity形态:
Activity一个最大的特点就是拥有多种形态,它可以在多种形态间进行切换,以此来控制自己的生命周期。
Activity大致会经过如下4种状态:
(1) 运行状态(Activt/Running): 此时Activity处于Activity栈的最顶层,用户可见,可以获得焦点,与用户进行交互。
(2)暂停状态(Paused):当Activity失去焦点,被一个新的非全屏的Activity或者一个透明的Activity放置在栈顶时,Activity就转化为Paused形态。该Activity依然可见,但它失去了与用户交互的能力,所有状态信息,成员变量都还保持着,只有在系统内存极低的情况下,才会被系统回收掉。
(3)停止状态(Stopped):如果一个Activity被另一个Activity完成覆盖,那么Activity就会进入Stopped状态。此时,它不在可见,但依然保持了所有状态信息和成员变量。
(4)销毁状态(Killed):该Activity结束或Activity所在进程被结束。
(三)Activity的生命周期:
onCreate(Bundle savedStatus) :Activity已经被创建完毕
onStart():Activity已经显示在屏幕,但没有得到焦点,就是还没有获得交互,点击组件是没有用的
onResume():Activity得到焦点,可以与用户交互
onPause():Activity失去焦点,无法再与用户交互,但依然可见
onStop(): Activity不可见,进入后台
onDestroy(): Activity被销毁
onRestart(): Activity从不可见变成可见时会执行此方法
下图为Activity的生命周期
但其中只有三个状态时稳定的,替他状态都是过渡状态,很快就会结束。
Resumed:就是前面说的运行形态,此时Activity出去Activity栈顶,处理用户的交互。
Paused:当Activity的一部分被挡住的时候进入这个状态,这个状态下的Activity不会接收用户输入。
Stopped:当Activity完成被覆盖时进入这个状态,此时Activity不可见,仅在后台运行。
(3.1)Activity启动与销毁过程:整个流程如下图1,2,3
在系统调用onCreate()之后,就会马上调用onStart(),然后继续调用onResume()以进入Resumed状态,最后就会停止Resumed状态,完成启动。系统会调用onDestroy()来结束一个Activity的生命周期让它回到销毁状态。
onCreate(Bundle savedStatus):创建Activity时被回调,该方法只会被调用一次。创建基本的UI元素。
onPause()与onStop():暂停Activity是被回调,停止Activity时被回调。 二者都是为了清除Activity的资源,避免浪费。
onDestory(): 清除开启的线程。
(3.2)Activity的暂停与恢复过程:过程下图1,2
当栈顶的Activity部分不可见后,就会导致Activity进入Pause状态,此时就会调用onPause(),当结束阻塞后,就会调用onResume()来恢复到Resume形态。
onPause():释放系统资源,如Camera,sensor,receivers。
onResume():需要重新'初始化在onPause()中是释放的资源。
(3.3)Activity的停止过程
栈顶的Activity部分不可见时,实际上后续会有两种可能,从部分不可见到可见,即是恢复过程;从部分不可见到完全不可见,即是停止过程。系统在当前Activity不可见的时候,总会调用onPause()方法。
当一个Activity重新回到前台状态的时候,过程如下图1,2,3,4
(四) Activity的重新创建过程
当你的系统上时间出于Stopped状态时而且此时系统需要更多内存或者系统内存极为紧张时,系统就会回收你的Activity,此时系统为了补偿你,会将Activity状态通过onSaveInstanceState()方法保存到Bundle对象中,当然你也可以增加额外的键值对存入Bundle对象以保存这些状态。当你需要重新创建这些Activity的时候,保存的Bundle对象就会传递到Activity的onRestoreInstanceState()方法与onCreate()方法中,这也是onCreate()方法中参数--Bundle saveInstandeState的来源。