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也是一个多任务的系统,不同任务是可以被互相切换的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值