Android活动生命周期

一、Android活动

活动是 Android 应用框架中的一个核心组件,它在一个窗口(Window)对象中绘制用户接口并响应用户的交互。

Android四大核心组件分别为Activity(活动)、Service(服务)、Content provider(数据源)、Broadcastreceiver(广播接收器)。

官方文档是这么定义的:“An Activity isan application component that provides a screen with which
users can interactin order to do something, such as dial the phone, take a photo, send an email,or view a map.”大概意思是说,Activity是一个可以让屏幕提供用户交互动作的组件,比如打电话、照相、发送邮件和查看地图等。简单来说,我们在应用程序中能看到的内容,绝大多数都是Activity组件提供的。

一个应用中通常包含多个活动,用户在不同的活动中执行不同的操作,但只有一个处于“活跃”状态:启动一个新的活动,前一个就会停止并被压入一个栈中。

一个Activity通常就是一个单独的屏幕(窗口)。主要做的事情就是:绘制用户接口、响应用户交互。一个Android程序可有多个活动组成,多个活动通过Intent进行通信。

Android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。

Activity活动的类图:

由上图可以看出,活动Activity这个类的直接父类是ContextThemeWarpper,图中Activity类指出去的虚线箭头都是Activity类所实现的接口。活动(Activity)是上下文(Context)的子类型,实现了窗口、键盘事件的的回调,还实现了布局扩展及创建上下文菜单的接口

二、Android活动的创建和使用

1.创建一个Activity

创建一个活动,通常直接继承 Activity类,并在子类中重写一系列的回调方法;

2.声明活动---在manifest中注册Activity

除了要定义和继承Activity之外,我们还需要在manifest中进行注册,表示声明,如果不声明的话,这个Activity在运行时候,会报ANR错误,就是应用程序没有响应。那么怎么声明呢,我们每新建一个项目时候,都会有一个AndroidManifest.xml文件,我们需要在AndroidManifest.xml文件中对我们的Activity进行注册。

可以看到,活动的注册在<application>标签中,这里通过<activity>标签来对活动进行注册的。

Android:name属性来具体注册哪一个活动,在这里我们对我们刚才定义的MainActivity类进行注册,由于在最外层的<manifest>标签中已经通过package属性指定了包名是com.example.helloworld,因此在注册活动时这一部分就可以省略了,当然你可以定义为com.example.helloworld.MainActivity,不过直接使用.MainActivity也就足够了。

Android:label指定活动中的标题栏的内容,标题栏是显示在活动的最顶部的,需要注意的是,给主活动指定的label不仅会成为标题栏的内容,还会成为启动器(Launcher)中应用程序显示的名称。之后在<activity>标签的内容我们加入了<intent-filter>标签,并在这个标签里添加了<actionandroid:name="android.intent.action.MAIN"/>和<category
android:name="android.intent.category.LAUNCHER"/>这两句声明。表示在手机上点击应用图标时,首先启动的就是这个活动,如果你的应用程序中没有声明任何一个活动作为主活动,这个程序仍然是可以正常安装的,只是你无法在启动中看到或者打开这个程序。这种没有主活动的应用程序,基本都是用为第三方服务居多,比如支付宝快捷支付服务。

最后再给这个活动增加业务逻辑、事件处理。

三、Android活动生命周期

1、生命周期概述

Android系统是一个多任务(Multi-Task)的操作系统,可以在用手机听音乐的同时,也执行其他多个程序(APP)。每多执行一个应用程序,就会多耗费一些系统内存,当同时执行的程序过多,或是关闭的程序没有正确释放掉内存,系统就会觉得越来越慢,甚至不稳定。

为了解决这个问题, Android 引入了一个新的机制----- 生命周期(Life Cycle)。Android 应用程序的生命周期是由Android 框架进行管理,而不是由应用程序直接控制。通常,每一个应用程序(入口一般会是某一个Activity 的onCreate 方法),都会产生一个进程(Process)。当系统内存即将不足的时候,会依照优先级自动进行进程(Process)的回收。不管是使用者或开发者,都无法确定的应用程序何时会被回收。所以为了很好的防止数据丢失和其他问题,了解生命周期很重要。

2、活动的生命周期-示意图:

图中白色矩形框中的方法,都是跟活动Activity生命周期相关的函数。

onCreate():每个活动中我们都会重写这个方法,它会在活动第一次被创建的时候调用,比如完成一些初始化操作,加载布局、绑定事件等

onStart():这个方法在活动不可见变为可见的时候调用;执行该方法后,活动就显示可见了。

onResume():这个方法在活动准备好和用户进行交互的时候调用,此时的活动一定位于返回栈的栈顶、并且处于运行状态;执行该方法后,活动即获得焦点。

onPause():这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。执行该方法后,失去焦点,不能再进行用户交互。

onStop():这个方法在活动完全不可见的时候调用。它和onPause()方法主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法不会执行。执行该方法后,活动不可见,进入“后台”。

onDestroy():这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

onRestart():这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

3、生命周期—分类

根据活动的复杂度,也许并不需要实现所有生命周期中的方法,但需要知道每个方法的功能,确保你的应用能像用户期望的那样执行;避免出现以下情况:

不会因为来电话或切换到其他应用而崩溃;

用户离开应用一段时间后返回,不会丢失进度;

用户设备屏幕旋转时,不会丢失进度或崩溃;

GPS 或其他传感器在不需要时不要一直消耗电量;

创建一个活动,通常直接继承 Activity,并在子类中重写一系列的回调方法;在活动状态发生改变时,这些方法由应用框架按照特定的顺序调用,我们称其为活动的生命周期;该周期按照执行的时间顺序可划分为:

1. 完全生命周期

2. 可见生命周期

3. 前台生命周期

1. 完全生命周期

活动在onCreate()和onDestroy()方法之间所经历的。就是上图所描述的顺序执行下来的过程。

2. 可见生命周期

活动在onStart()和onStop()方法之间所经历的。


回调方法


描述


onRestart


活动从隐藏状态进入可见状态


onStart


活动进入可见状态:

初始化 onStop 是释放的资源:如注册广播接收器


onResume


活动到前台,UI获得焦点,进入运行状态


onPause


活动被另一个半透明或对话框(非全屏)的活动遮挡,仍然可见,但失去焦点,不可以操作。

停止动画或正在执行的操作,提交没有保存的改变


onStop


活动到后台,不可见,但依然存活

保存数据(文件或数据库)

注销广播接收器

3. 前台生命周期

也叫交互活动期,活动在onResume()和onPause()方法之间所经历的。

为方便理解,在下图中做了范围对比:

4、保存活动状态

在系统内存不足时,系统会把处于暂停或停止状态的活动销毁;当用户要再次回到已被销毁的活动时,系统会重新创建该活动;此时,会回调以下方法:

onSaveInstanceState(Bundle savedInstanceState)

onRestoreInstanceState(Bundle savedInstanceState)

四、活动的任务栈

在Android中,多个Activity定义在一个Task中,也就是说一个Task是一组Activity的集合,然后Activity又被安排在back stack,即返回栈,是按照后进先出的规则进出栈的。如图:

当从手机中启动一个应用程序图标时,应用程序的Task随之也变成前台进程,如果首次启用时,发现不存在Task实例,那么系统会创建一个Task实例,然后把"main”Activity放入到stack中,默认是栈顶,这样一个Task就管理了一组栈,栈里管理多个Activity。当从Activity1中启动Activity2时,Activity1被推到栈底,Activity2变成栈顶,同理,Activity3进栈的过程和Activity2是一样的,如果我们按back按钮,则Activity3被弹出,系统会根据内存情况进行销售或者回收,Activity2则被推到栈顶,以此类推。当一直按back,返回到主页面,则所有的activitys被全部弹出,则task不复存在。

同时,task有两种状态:Foreground和Background,前景和背景。当处于Background时,所有的activitys是停止的,当处于Foreground时,表示当前用户交互的应用程序。

比如两个应用程序A和B,我们刚开始启动了A应用程序,此时Task A是Foreground,用于与用户交互,当我们点击Home Button时,此时Task A变成Background,里面所有的activitys都是停止的,此时如果我们又启动了B应用程序,Task B又会被实例化,TaskB变成Foreground,不过Task A仍然是Background,一直等待着被恢复。所以是Android也是一个多任务的系统,不同任务是可以被互相切换的。

时间: 2024-08-25 17:18:20

Android活动生命周期的相关文章

Android笔记-活动生命周期&amp;Bundle回收临时数据&amp;活动启动模式&amp;常用技巧

Android使用任务(Task)管理活动,是一组存放在返回栈(Back Stack)里的活动的合集: 系统总是显示栈顶活动给用户: 启动新活动->新活动入栈 按下Back键或调用finish()->栈顶活动出栈 活动生命周期的四种状态: 1. 运行状态:处于栈顶 2. 暂停状态:不处于栈顶,但仍然可见 3. 停止状态:不处于栈顶,完全不可见,系统仍然保存其状态和成员变量,但不可靠 4. 销毁状态:从栈中移除,活动被系统回收 Activity的七个回调方法: 1. onCreate():活动第

Android的生命周期学习

掌握Android的生命周期对于如何一个刚刚接触Android初学者来说是至关重要的,在然后的开发中会给我留有更多的时刻余地,当自己正在认识Android中整个声明周期后,会编写出更加的流畅的程序 应用程序会拥有更好的用户体验的效果 活动状态 在Android中活动中生命周期有四个状态 1.运行状态也称为显示状态:当一个活动处于或者返回栈顶位置,这时候的活动就是处于运行状态 2.暂停状态:当一个活动不再处于栈顶位置时,但是仍然可见,则该活动就进入了暂停状态 3.停止状态:当一个活动不再栈顶位置,

Android组件生命周期(二)

引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生命周期将讨论活动.服务.广播接收者的生命周期——包括在生命周期中他们可能的状态.通知状态改变的方法.及这些状态的组件寄宿的进程被终结和实例被销毁的可能性. 上篇Android组件生命周期(一)讲解了论活动的生命周期及他们可能的状态.通知状态改变的方法.本篇将介绍服务和广播接收者的生命周期: 服务生命

Android组件生命周期(一)

引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生命周期将讨论活动.服务.广播接收者的生命周期——包括在生命周期中他们可能的状态.通知状态改变的方法.及这些状态的组件寄宿的进程被终结和实例被销毁的可能性. 本文主要讨论活动的生命周期及他们可能的状态.通知状态改变的方法.分为以下三部分: 1.活动生命周期 2.保存活动状态 3.协调活动 1.活动生命

android的生命周期

1.运行状态:当一个活动处于栈的顶部时,这时活动就处于活动状态,系统是不愿意回收处于活动状态的,会影响用户体验. 2.暂停状态:当一个活动不再处于栈的顶部时,但仍然可见时,这时就是暂停状态了.处于暂停状态的活动仍然可见,系统也愿意回收,刚样也会影响用户体验. 3.停止状态:当一个活动不再处于栈的顶部时,并且完全不可见时,这时就是停止状态了.系统仍然会为这种活动保存成员变量和相应的状态,只有在内存很低的情况下才会进行回收. 4.销毁状态:当一个活动从栈中移除时,这时就是销毁状态了.系统会最先处理这

Android Activity生命周期 onSaveInstanceState和onRestoreInstanceState

当某个activity变得"容易"被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候. 注意上面的双引号,何为"容易"?言下之意就是该activity还没有被销毁,而仅仅是一种可能性.这种可能性有哪些?通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清

Android Activity 生命周期的透彻理解

说来惭愧,虽然已经做了一年多的android开发,但是最近被人问起activity的生命周期的时候,却感觉自己并不能很自信很确定的回答对方的问题,对activity的生命周期的理解还不透彻啊.     既然发现了问题,那咱就得解决问题,不就个生命周期,能有多复杂. 首先看看android developers 网上的activity的生命周期图:      activity启动的时候:onCreate ---> onStart ---> onResume 这个过程不用多说,大家都知道.这里主要

Android Activity生命周期图解

Android 中 Activity生命周期 从网上摘的 事件回调方法  以下1-4 不可终止 . 1. onCreate()   :Activity 启动后第一个被调用的方法 ,常用来进行Activity的初始化,例如创建View.绑定数据或者恢复信息等 .. (? oncreate 可以恢复什么信息 ) 2. onStart() : 当Activity显示在屏幕上时,该方法被调用 3. onRestart() :当Activity从停止状态进入活动状态前,调用该方法 . 4.onResume

两分钟彻底让你明白Android Activity生命周期(图文)!

首先看一下Android api中所提供的Activity生命周期图(不明白的,可以看完整篇文章,在回头看一下这个图,你会明白的): Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码: 1 public class Activity extends ApplicationContext { 2         protected void onCreate(Bundle savedInstanceState);        3