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也是一个多任务的系统,不同任务是可以被互相切换的。
Android活动生命周期相关推荐
- android 活动生命,Android 活动生命周期
一.活动生命周期的意义 Activity(活动)是一种可以包含用户界面的组件,主要用于与用户进行交互.也就是说,在用户与界面进行交互之前,必须要进行特定的初始化操作.再者,Android 操作系统是一 ...
- android生命周期_Android活动生命周期– 7个阶段和功能
android生命周期 Activity is one of the primary components of an Android application. In this tutorial, w ...
- Android Service 生命周期
Android Service的生命周期 Managing the Lifecycle of a Service service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A ...
- android 生命周期管理,Android Activity生命周期和堆栈管理的详解_Android_脚本之家...
Activity的生命周期 Activity是Android中的四大组件之一,也是最基本,最重要的组件,是android系统提供一个可视化的,能与用户交换的组件. 系统提供的组件,不需要用户实例化,用 ...
- Android:Fragment生命周期(结合Activity的生命周期进行分析)
文章目录 前言 一.Fragment生命周期概述 启动 退出 二.Fragment生命周期细述 1.onCreate(Bundle) 2.onCreateView(LayoutInflater, Vi ...
- 4 活动生命周期:活动的一生
1.活动是所有Android应用的基础 1.1 活动如何工作 1.1.1 应用是一个由活动.布局和其他资源组成的集合. 其中一个活动是应用的主活动. 1.1.2 每个应用都在自己的进程中运行. 每个应 ...
- Android Acitivity 生命周期
Fragment 的生命周期: Android Fragment 生命周期及其API使用(建议使用自定义View替换Fragment) Activity的生命周期: (1)启动Activity:系统会 ...
- android fragment 生命周期
今天,简单讲讲fragment 的生命周期. 其实,对于fragment ,大家都很熟悉.我也经常使用,但是最近做一个功能时,在activity里面调用fragment 的函数,发现变量居然没有初始化 ...
- Android:生命周期案例
在学习Android应用生命周期章节中,书本上写的有点笼统,较难理解.为了理解的更深,写了个程序测试一下. 1.在layout文件夹中建一个dialog_layout.xml <?xml ver ...
最新文章
- linux上设置了log4j没有产生日志文件_关于 log4j 升级到 log4j2 的小结
- Android Studio的配置问题——Intel HAXM is required to run this AVD,VT-x is disabled in BIOS;
- 希尔排序(C++版)
- linux基础-1.1USB设备(USB1.0以上)连接使用
- SlideringDrawer的使用(抽屉效果)
- 几个常用的正则表达式
- 计蒜客——数位反转问题(代码+解析)
- 个人博客网站文章添加目录导航
- 20w7珠led驱动电源电路图_LED串联驱动电路图
- web.xml 详解
- 基于Spring MVC + Spring + MyBatis的【银行卡系统】
- Jieba分词并去停用词
- 【unity 保卫星城】--- 开发笔记01(飞机移动)
- 部署无鱼工时系统,超详细教程,并成功部署
- 研究生毕业后,再重新读个硕士
- 2、GIT---时光穿梭机
- 从程序员到项目经理(5):程序员加油站 -- 不是人人都懂的学习要点
- 7723java世界Ol,你不知道的《世界OL》
- 解决电脑搜不到WiFi6无线路由信号问题
- crc-itu java实现_JAVA编程心得-JAVA实现CRC-CCITT(XMODEM)算法
热门文章
- 2022年河南省高职单招(面试)考试冲刺试题及答案
- 微信小程序完整脚本源码-20180624版
- python实现成语接龙接到指定成语(一个顶俩的扩展版)
- 要为了愉悦和理解而阅读,如果你认为阅读不过是上传一些信息,那么你就会一直觉得它太慢了
- 2019第四届团体程序设计天梯赛总结
- 撒币啦!撒币啦!百度云10万红包等你拿
- 【科普一下】量子密码就是量子通信?
- java 耗时 框架_真真香!耗时大半个月收整全套「Java架构进阶pdf」没白费
- MySQL基础 (SQLyog)尚硅谷婷姐 学习笔记整理
- Gyroscope Larnging 001: Angle Momentum Rotational Inertia