重温Android四大组件(一)—Activity的生命周期
前言
四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了。但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心。
这里以《重温Android四大组件》为题目是为了巩固自己的Android基础,加深对Android的认知。
Activity生命周期探索
Activity生命周期是Activity在不同场景下表现的一种状态,在Android开发中的表现就是提供给开发者的生命周期函数。使用Activity生命周期函数的目的就是定义Activity在不同时期的表现。下图是Android官方文档中提供的Activity生命周期函数回调。在这张图中可以看到Activity在各种场景中的状态变化。
onCreate() 表示Activity正在被创建。在系统首次创建时触发,并且onCreate在整个Activity生命周期中只触发一次。在onCreate中我们可以做一些初始化工作。
onStart() 表示Activity正在启动。此时Activity对用户可见,并且正在准备进入前台并且变得可交互。
onReStart() 表示Activity正在重新启动。一般来说Activity从后台回到前台时会调用onRestart方法。比如,用户点击home键将Activity放到后台,然后返回应用。
onResume() 表示Activity已经进入到前台,用户可以与Activity进行交互了。Activity将会停留在resume状态直到有其它事件发生时Activity失去焦点,比如说用户切换到其它Activity。
onPause() 表示Activity正在停止。也就是说某些事件发生导致用户正在离开当前Activity。在onPause方法中可以释放一些系统资源,比如传感器或者可能影响电池续航的一些行为。但是需要注意的时不能再onPause中作耗时操作,因为在启动其他Activity时,执行过当前Activity的onPause方法后才会执行新的Activity的onResume方法。
onStop() 表示Activity即将停止。此时Activity对用户已经是不可见的了,但是此时Activity对象依然在内存中。在onStop中可以做一些稍微重量级的操作,比如数据库操作、暂停动画或者处理一些对用户不可见的资源。
onDestroy() 表示Activity将要销毁。这是Activity生命周期中的最后一个回调函数。在onDestroy方法中需要释放所有资源。
Activity在不同场景中的生命周期状态
(1)Activity被启动并结束
触发条件:用户按下back键或者调用了Activity的finish方法。
这个简单的场景是最常出现的。这个场景可以归纳为:onCreate()->onStart()-onResume()->点击返回键->onPause()->onStop()->onDestroy()
(2)用户切换出当前应用
触发条件:用户按下HOME键或者在任务栏中切换到其它应用。
在这个场景中Activity被放到后台,但是并没有被销毁,Activity实例依然在内存中,如果系统没有回收进程,Activity实例会保有之前的状态。这个场景可以归纳为:onCreate()->onStart()-onResume()->点击HOME键->onPause()->onStop()->onSaveInstanceState()->返回应用->onRestart()->onStart()->onResume()
(3)系统配置变化
触发条件:比如:屏幕方向改变、键盘语言变化等。
在上述条件中,屏幕方向改变应该是最常见的现象。系统配置的改变会导致Activity的销毁以及重建。生命周期变化是:onCreate()->onStart()->onResume()->屏幕方向变化->onPause()->onStop()->onSaveInstanceState()->onDestory()->onCreate()->onStart()->onRestoreInstanceState()->onResume()。
可以看到在屏幕方向变化期间,Activity经历了销毁和重建两个过程。可以注意到在这期间有两个方法被调用到,它们分别是onSaveInstanceState和onRestoreInstanceState,这两个方法时用来恢复Activity状态使用的,通过Bundle传递参数。
在上面的情况中,由于Bundle无法传递大量的数据,开发者可以选择自己处理系统配置变化。在AndroidManifest.xml文件中改变Activity的配置。比如,处理屏幕方向改变可以加入配置:android:configChanges="orientation"。这个时候屏幕方向改变是就会调用onConfigurationChanged方法。此时的生命周期变化是:onCreate()->onStart()->onResume()->屏幕方向变化->onConfigurationChanged()。
可以看到,如果开发者自己处理系统配置改变,那么Activity就不会销毁重建了,而是直接调用onConfigurationChanged方法。
(4)启动模式对生命周期的影响
我们知道Activity有4中启动模式,分别是standard(标准模式)、singleTop(栈顶复用模式)、singleTask(栈内复用模式)、singleInstance(单实例模式)。启动模式不同也会导致Activity生命周期不同的变化。
standard(标准模式):标准模式下的Activity在每次启动时都会创建新的Activity实例,它的生命周期跟上面图中所示相差无几。
singleTop(栈顶复用模式):在这种模式下的Activity如果处于Activity栈栈顶,那么会复用Activity实例,启动的时候就会调用onNewIntent()->onRestart()->onStart()->onResume()。如果不是处于栈顶就会调用onCreate()->onRestart()->onStart()->onResume()。
singleTask(栈内复用模式):在这个模式下的Activity只要在Activity栈内存在实例就会复用这个实例,那个生命周期变化是:onNewIntent()->onRestart()->onStart()->onResume()。
singleInstance(单实例模式):在这种模式下Activity单独存在一个Activity栈中,启动调用onCreate()->onRestart()->onStart()->onResume()
通过Activity生命周期函数记录Activity状态
在上面的系统配置变化的例子中可以看到Activity中提供了记录状态的方法。onSaveInstanceState以及onRestoreInstanceState,这两个方法都是用Bundle。除此之外我们还能看到在onCreate方法中也有一个Bundle类型的参数,这个Bundle就是保存的状态的载体。
我们知道Activity会由于一些行为被销毁,比如,退出Activity。这些正常的操作会销毁Activity实例,并且系统不会保有Activity的状态。还有一种情况是当Activity处于后台时,由于内存问题会被系统回收或者系统配置改变导致的销毁重建,这个时候系统会保有Activity的状态,就是Bundle存储的数据,在Activity重建是会获取到Bundle中的数据。
总结
在上面介绍了Activity在各种场景下的生命周期表现。理解这些生命周期的调用有利于在开发时更好的处理Activity与用户的交互,同时也能避开一些常见的问题。
转载于:https://juejin.im/post/5cbaae115188253247129e3e
重温Android四大组件(一)—Activity的生命周期相关推荐
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- Android四大组件之一Activity的生命周期
Activity的七大生命周期 onCrate 不可见不可交互. onStart 可见不可交互 . onResume 可见可交互 . onPause 可见不可交互 .onStop 不可见不可交互 . ...
- Android四大组件之Activity(第一篇-简单使用)
Android四大组件之Activity(第一篇-简单使用) 前言 一.Activity是什么? 二.如何使用 1.继承 2.重写onCreate() 总结 文章目录 前言 一.Activity是什么 ...
- Android实验二:Activity的生命周期
要求 设计如下界面,包括四个按钮,两个文本框.单击对应按钮可以启动对应activity.假 定Activity A为启动Activity. 部分代码 import androidx.appcompat ...
- 【Android 四大组件之Activity】一文吃透Activity 生命周期
作者:半身风雪 简介:在Android组件中最基本也是最为常见的四大组件: Activity Service服务 Content Provider内容提供者 BroadcastReceiver广播接收 ...
- Android 四大组件之 Activity
什么是 Activity? Activity 是 Android 的四大组件之一,是用户操作的可视化界面,它为用户提供了一个完成操作指令的窗口. 当我们创建完 Activity 之后,需要调用 set ...
- android四大组件之Activity(三)
这是一篇关于android开发四大组件Activity部分的笔记之一,其中主要介绍Activity的生命周期以及一些实例等内容.这里所用到的开发工具是Android4.1. 目录 14.Activit ...
- 第六课-Android四大组件之Activity
Activity是Android四大组件之一,它是个控制类,主要控制界面的加载显示,用户交互处理,数据的获取,数据的传送等.在它的onCreate方法中的setContentView方法就是来加载一个 ...
- Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)
什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...
最新文章
- 没有了传感器,工业机器人还能工作吗?
- 官宣!中央广播电视总台《2021年春节联欢晚会》总导演组公布
- 【Python】Error:Input 'y' of 'Add' Op has type float32 that does not match type int32 of argument 'x'.
- python使用print不换行
- 台积电:高雄地震对生产影响比预期略高
- C# 类与对象(面向对象的编程)
- 什么是网关,网关的作用
- 关于Java Web工程中web.xml文件
- python之numpy基础_Python之Numpy操作基础
- manjaro xfce 环境配置
- oracle直接路径读,direct path read直接路径读
- 宏基因组分析-基于组装
- MatLab SimuLink国产代替
- 《文明6》引言科普 引言出处讲解 【转】
- 少儿编程scratch如何快速上手?
- ALBRECHT铣刀夹头BT50 20-32
- Linux下基于GTK人脸识别界面设计
- 前端学习笔记-9.1怎样注册亚马逊aws免费1年云服务器?
- 在Visual2019中如何添加日历表?这里有答案
- 嵌入式Linux移植littlevgl7,安富莱V6移植littlevgl的前因后果,附移植好的工程(未优化)...
热门文章
- 白话Elasticsearch43-深入聚合数据分析之案例实战__排序:按每种颜色的平均销售额升序排序
- Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator
- unable to access ‘https://gitee...‘: Failed to connect to 127.0.0.1 port 31181 after 2029 ms: Connec
- python 状态机教程_python 实用工具状态机transitions
- QT界面操作1:如何跟踪鼠标位置?
- java web jsp相对路径_Java Web中的相对路径与绝对路径总结
- Spring学习3之IOC创建对象的方式
- python 对象创建_从Python中的基类对象创建对象
- caffe windows学习:第一个测试程序
- Visual Studio 2010或者2012上安装VASSISTX