Android开发中Activity的生命周期及加载模式详解
作者:青玉伏案 发布时间:2021-07-28 02:33:44
本文给大家介绍Activity的生命周期,如果大家学习过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似。生命周期,并不难理解。一个人的生命周期莫过于生老病死,花儿的生命周期就是花开花谢了。在Android中Activity的生命周期莫过于Activity的创建到消亡的过程了。本篇博客就会介绍Activity生命周期中的不同阶段,通过实例的形式来窥探一下Activity的生命周期。搞明白Activity的生命周期是至关重要的,因为只有搞明白每个生命周期的每个阶段,你才能在不同段做不同的事情。
接下来我们将通过一个实例来介绍Activity的生命周期,在这个Demo中会有一个MainActivity, MainActivity就是App启动后第一个显示的Activity。在MainActivity上有一个按钮,点击这个按钮就会跳转到SecondActivity,点击返回键就会从SecondActivity中返回到MainActivity中,再点击返回键就会退出App。通过这一些列的Activity的切换,我们将通过打印Log的方式来进行观察Activity的生命周期。
一.代码编写
其实这篇博客的代码是非常简单的,就是重写Activity生命周期不同阶段的方法,然后在方法中进行Log的打印,从而来标记这个生命周期的阶段。而Demo的UI也是灰常的简单的,所以Activity的layout文件就不做过多的赘述了。接下来看一下两个Activity中的关键代码。
1.下方的代码是MainActivity中的关键代码,对Activity生命周期的不同阶段进行重写,然后打印日志,标记出是哪个Activity中的哪个方法。在onCreate()方法中通过id获取Button, 然后给按钮绑定上单击事件,点击button时跳转到SecondActivity中。具体代码如下。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("lifeCycle", "MainActivity: 我是onCreate方法,我会在Activity第一次被创建是调用");
Button jumpButton = (Button) findViewById(R.id.jump_second_button);
jumpButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳转到SecondActivity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
//Ctrl + O 选择父类中的方法进行重写
@Override
protected void onStart() {
super.onStart();
Log.d("lifeCycle", "MainActivity: 我是onStart方法,我会在Activity由不可见变为可见时调用");
}
@Override
protected void onResume() {
super.onResume();
Log.d("lifeCycle", "MainActivity: 我是onResume方法,我在Activity处于运行状态时调用");
}
@Override
protected void onPause() {
super.onPause();
Log.d("lifeCycle", "MainActivity: 我是onPause方法,我会在Activity暂停时调用");
}
@Override
protected void onStop() {
super.onStop();
Log.d("lifeCycle", "MainActivity: 我是onStop方法,我会在Activity停止时调用");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("lifeCycle", "MainActivity: 我是onRestart方法,我会在Activty从停止状态变为运行状态时调用");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("lifeCycle", "MainActivity: 我是onDestroy方法,我会在Activty销毁之前调用");
}
2.在SecondActivity中的也是重写上述方法,唯一的区别就是把上面日志中的MainActivity改成SecondActivity,代码类似就不往上粘贴了。
二、运行观察打印的log
运行我们的app,然后观察打印的日志,通过实例来分析Activity的生命周期。具体步骤如下:
1.创建并激活Activity
首次打开App所打印的Log如下图所示。打开App首先看到的时MainActivity, 通过Log我们不难看出在MainActiviy首次出现时要调用如下三个方法,经过下方的三个方法,MainActivty就会被创建,然后变为可见,最后处于运行状态。
(1).onCreate()方法:Activity首次出现创建时会调用该方法,在之前的Demo中我们在此方法中加载Activity的布局和或控件并关联事件。
(2).onStar()t方法:接着就会执行onStart()方法,Activity由不可见状态变为可见状态会调用该方法。
(3).onResume方法:Activity变为可见后接着要调用onResume方法来变为运行状态。
2.Activity间切换
为了更清楚,在点击按钮跳转到SecondActivity之前,我们可以清除一下Log, 下方左边有一个垃圾桶的标志,就是用来清除之前打印的日志的。下方所打印的日志就是点击跳转按钮时所打印的日志。在这个切换过程中,MianActivty会停止运行变为不可见,而SecondActivy就会被创建并且处于运行状态。具体步骤如下。
(1).onPause()方法:当点击跳转按钮时,运行中MainActivity就会调用onPause()变为停止状态,但仍然可见。
(2).接着就是SecondActivity调用onCreate()方法进行创建,调用onStart()方法进行显示,调用onResume()方法进行运行的过程。
(3).onStop()方法:当SecondActivity处于运行状态时,MainActivity就完全不可见了,所以就会调用onStop()方法,进入完全不可见停止状态。
3.从另一个Activity返回
从SecondActivity中点击返回键,从SecondActivity中返回到MainActivity中。下方的Log是点击返回按钮时所打印的Log.
(1)onPause()方法:点击返回按钮后,SecondActivity会调用onPause()方法,进入暂停运行状态。
(2)onRestart()方法:接着MainActivity就会调用onRestart()方法,由停止状态变为运行状态。然后MainActivity又会调用onStart方法从不可见变为可见,接着会调用onResume()方法最终进入运行状态。
(3)当返回到MainActivity中并且MainActivity处于运行状态后,SecondActivity会调用onStop方法,停止运行并不可见。因为SecondActivty做的事出栈操作,停止运行后,就会调用onDestory方法进行销毁。下此在进入SecondActivity中时,还是从onCreate方法进行执行。
4.Activity退出并销毁
接着在MainActivity中点击返回按钮就会退出App了,下方是退出App时打印的Log信息。MainActivty先调用onPause()方法变为暂停运行状态,然后再调用onStop()方法停止运行,最后调用onDestroy()方法进行销毁。
三.生命周期流程图
1.上面是用语言通过实例打印出的Log来描述两个Activity切换的生命周期,接下来将用一个流程图来描述这一过程,具体流程图如下。
2.通过上面的实例不难分析出一个Activity的生命周期分为哪些阶段,并且很容易的看出哪些阶段在什么时候执行,所以我们很容易的画出一个Activity的生命周期,下方的流程图是一个Activity的生命周期。
四.Activity的加载模式
Activity的启用模式也较为简单,它会在活动切换时用到。Activity的启动模式分为四种,standard、singleTop、singleTask、singleInstance模式。接下来将为大家详细的介绍一下这几种加载模式。
Activity的加载模式可以在配置文件AndroidManifest.xml中进行配置,配置项为android:launchMode具体如下图所示:
1.standard模式
在Activity的栈中无论该活动有没有加入栈,活动就会被创建。测试方式是把MainActivity的launchMode设置成standard, 在MainActivity中添加一个按钮,点击按钮使用Intent跳转到当前Activity,看onCreate方法中打印的Log。点击按钮的方法如下:
Button launchModelButton = (Button) findViewById(R.id.launch_model_button);
launchModelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
}
});
standard加载模式的栈如下所示,无论栈中有没有该对象的实例,都会被创建。
2.singleTop模式
只要被创建的活动不位于栈的顶部,该活动就会被创建入栈。如果将要被创建的活动位于栈的顶部,该活动的实例就不会被创建。测试方法,把上面的模式直接改成singleTop模式,MainActivty往自己身上跳转就不会从新创建一个新的实例,会重用之前在栈顶中的实例。如果是MainActivty跳转到SecondActivty, 然后SecondActivity再次跳转到MainActivty, 那么此时的MainActivity将会被创建,因为栈顶是SecondActivity。如下所示:
3.singleTask模式
单任务模式,这个也不难理解,如果从MainActivty跳转到SecondActivity, 如果再从SecondActivty跳转到MainActivity, 在单任务模式下MainActivity已经在栈中,就会把它之前的Activity出栈,使其处于在栈顶活跃的位置。原理如下图所示:
4.singleInstance
可以看成单例模式,这个比较特殊,被设置成singleInstance的Activity将会放入另一个栈中,因为这样为了便于共用。上面3中模式位于同一个栈中。下方ThirdActivity跳转到一个加载模式为singleInstance的Activity中。
今天的Activity生命周期就先到这儿,相关内容会在下篇博客中进行更新。
猜你喜欢
- 跨域配置如下,Springboot 版本为 2.4.1///跨域访问配置@Configurationpublic class CorsCon
- 今天一起学习下如何在Spring中进行异步编程。我们都知道,web服务器处理请求 request 的线程是从线程池中获取的,这也不难解释,因
- 背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生。需求:收到红包的时候进行
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- java LRU(Least Recently Used )详解LRU是Least Recently Used 的缩写,翻译过来就是“最近最
- springMVC默认的解析器里面是没有加入对文件上传的解析的,,使用springmvc对文件上传的解析器来处理文件上传的时需要用sprin
- 以下内容来自 * ,关于静态类型检查和动态类型检查的解释:•静态类型检查:基于程序的源代码来验证类型安全的过程;•动态类型检查:在程序运行
- Android 拦截返回键事件的实例详解KeyEvent类Android.View.KeyEvent类中定义了一系列的常量和方法,用来描述A
- Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"
- 在本次项目中,由于时间紧张直接使用DWR做Ajax请求!要求的是动态展示,那就需要使用DWR轮询请求,但是需要做异常情况下的一些处理!特别是
- 目录一、log4j简介1、Loggers2、Appenders3、Layouts二、配置详解1、配置根Logger:2、配置日志信息输出目的
- 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。例如:
- 先上效果图文件和加密文件之间的转换。先添加辅助类public class AES_EnorDecrypt { &n
- 先吐槽一下,现在的Bean Searcher操作手册的指引弱的可怜…对我这样的小白及其不友好话不多说直入主题1、首先肯
- Spring Expression Language (SpEL)是强大的表达式语言,支持查询、操作运行时对象图,以及解析逻辑、算术表达式。
- 1.动态绑定机制java的动态绑定机制非常重要实例A我们来看一个实例:阅读上面的代码,请说明下面的程序将输出什么结果:程序将会输出40和30
- 本文实例讲述了Java实现的计算最大下标距离算法。分享给大家供大家参考,具体如下:题目描述给定一个整形数组,找出最大下标距离j−i, 当且A
- 本文实例为大家分享了Android自定义轮播图的具体代码,供大家参考,具体内容如下定义Banner主要使用ViewPager实现滑动publ
- 本文实例讲述了C#创建、读取和修改Excel的方法。分享给大家供大家参考。具体如下:windows下我们可以通过 Jet OLE DB访问E
- 本文实例为大家分享了Java实现多任务执行助手的具体代码,供大家参考,具体内容如下1.多线程执行任务类package com.visy.th