【android开发-04】android中activity的生命周期介绍

1,返回栈

android中使用任务task来管理activity,一个任务就是一组存放在栈里的活动的集合,这个栈被称为返回栈。栈是一种先进先出的数据结构。当我们启动一个新的活动,他会在返回栈中人栈,并处以栈顶的位置,而当我们按下back键或者finish去销毁一个活动时,处于栈顶的活动会出栈,这是前一个入栈的活动就会重新处于栈顶的位置。
在这里插入图片描述

2,活动状态
在Android中,Activity的活动状态可以根据其生命周期中的状态进行区分。

活动状态:当Activity处于活动状态时,它位于Activity栈的顶部,是用户当前正在查看的界面,与用户可以进行交互。

暂停状态:当Activity失去焦点时,或者被一个新的非全屏的Activity,或者被一个透明的Activity放置在栈顶时,Activity就转化为暂停状态。此时,系统在杀死或者结束之前会调用onSaveInstance()方法来保存信息,同时,当Activity被移动到前台时,重新启动该Activity并调用onRestoreInstance()方法加载保留的信息,以保持原有的状态。

停止状态:当Activity被另一个Activity完全覆盖的时候,就被停止了。虽然此时它在运行,但用户却看不见。

结束状态:当Activity处于暂停或者停止状态时,系统可以结束Activity,回收资源。处于结束状态的Activity如果要使用户可见,只要重启才可以。

3,活动的生命周期

在Android中,Activity的生命周期是由一系列的方法组成的,这些方法在Activity的不同状态下被系统自动回调。这个生命周期可以被大致划分为三个阶段:活动生命周期、暂停生命周期和停止生命周期。

活动生命周期:
onCreate():当Activity正在被创建时调用。
onStart():Activity已经可见,但还没出现在前台,用户无法与其进行交互。
onResume():Activity已经可见并且出现在前台工作,用户可以与它进行交互。

暂停生命周期:
onPause():表示Activity正在暂停,但Activity依然可见,可以执行一些轻量级操作,但一般不会进行太多操作,因为这样会影响用户体验。

停止生命周期:
onStop():表示Activity即将暂停,此时Activity工作在后台,已经不可见了,可以与onPause方法一样做一些轻量级操作,但依然不能太耗时。
onDestroy():表示活动即将被销毁。

这些方法都按照一定的顺序被调用,且每个方法在其后继方法之前被调用。然而,这些方法是否被回调并不完全依赖于Activity的状态,还取决于是否需要系统资源来运行其他组件或进行其他操作。例如,如果系统内存不足,那么系统可能会销毁一些正在运行的Activity以释放资源。
在这里插入图片描述

4,activity运行的生命周期的例子
以下是一个简单的Android应用程序,演示了Activity生命周期的运行情况:

1,创建一个新的Android项目,并在布局文件activity_main中添加一个按钮。

2,在MainActivity中,覆盖以下生命周期方法:

public class MainActivity extends AppCompatActivity {  private static final String TAG = "MainActivity";  private TextView textView;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  textView = findViewById(R.id.text_view);  Button button = findViewById(R.id.button);  button.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  startActivity(new Intent(MainActivity.this, SecondActivity.class));  }  });  }  @Override  protected void onStart() {  super.onStart();  Log.d(TAG, "onStart");  }  @Override  protected void onResume() {  super.onResume();  Log.d(TAG, "onResume");  }  @Override  protected void onPause() {  super.onPause();  Log.d(TAG, "onPause");  }  @Override  protected void onStop() {  super.onStop();  Log.d(TAG, "onStop");  }  @Override  protected void onDestroy() {  super.onDestroy();  Log.d(TAG, "onDestroy");  }  
}

3,创建一个名为SecondActivity的新Activity,并在布局文件activity_second中添加一个文本视图。
4,在SecondActivity中,覆盖以下生命周期方法:

public class SecondActivity extends AppCompatActivity {  private static final String TAG = "SecondActivity";  private TextView textView;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_second);  textView = findViewById(R.id.text_view);  }  @Override  protected void onStart() {  super.onStart();  Log.d(TAG, "onStart");  }  @Override  protected void onResume() {  super.onResume();  Log.d(TAG, "onResume");  }

运行程序的log信息
在这里插入图片描述
点击按钮,启动SecondActivity
在这里插入图片描述
由于第二个activity已经把main activity完全挡住,因此onPause和onStop得到执行。
然后按back键返回main activity
在这里插入图片描述
之前main activity已经进入停止状态,所以onReStart,onStart,onResume依次执行,最后在main activity现在执行back键退出程序
在这里插入图片描述
依次执行onPause,onStop,onDestroy销毁程序。

5,activity中保存和恢复数据
在Android中,Activity可以使用Bundle对象保存和恢复数据。下面是一个示例,展示了如何在Activity之间保存和恢复数据:

首先,创建一个新的Activity类,例如FirstActivity:

public class FirstActivity extends AppCompatActivity {  private static final String KEY_NAME = "name";  private static final String KEY_EMAIL = "email";  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_first);  if (savedInstanceState == null) {  Intent intent = new Intent(this, SecondActivity.class);  intent.putExtra(KEY_NAME, "John Doe");  intent.putExtra(KEY_EMAIL, "johndoe@example.com");  startActivity(intent);  } else {  String name = savedInstanceState.getString(KEY_NAME);  String email = savedInstanceState.getString(KEY_EMAIL);  //恢复数据到界面上  TextView nameTextView = findViewById(R.id.name_text_view);  TextView emailTextView = findViewById(R.id.email_text_view);  nameTextView.setText(name);  emailTextView.setText(email);  }  }  
}

在这个示例中,我们使用Bundle对象保存数据,并使用putExtra()方法将数据传递给下一个Activity。在恢复数据时,我们使用getString()方法从Bundle对象中获取数据,并将其设置到界面上。

接下来,创建一个名为SecondActivity的新Activity类:

public class SecondActivity extends AppCompatActivity {  private static final String KEY_NAME = "name";  private static final String KEY_EMAIL = "email";  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_second);  if (savedInstanceState == null) {  Intent intent = getIntent();  String name = intent.getStringExtra(KEY_NAME);  String email = intent.getStringExtra(KEY_EMAIL);  //将数据保存到Bundle对象中  Bundle bundle = new Bundle();  bundle.putString(KEY_NAME, name);  bundle.putString(KEY_EMAIL, email);  setResult(RESULT_OK, new Intent().putExtras(bundle));  } else {  //从Bundle对象中获取数据并显示在界面上  String name = savedInstanceState.getString(KEY_NAME);  String email = savedInstanceState.getString(KEY_EMAIL);  TextView nameTextView = findViewById(R.id.name_text_view);  TextView emailTextView = findViewById(R.id.email_text_view);  nameTextView.setText(name);  emailTextView.setText(email);  }  }  
}

在这个示例中,我们使用getIntent()方法获取传递的数据,并将其保存到Bundle对象中。然后,我们使用setResult()方法将Bundle对象传递回上一个Activity。在恢复数据时,我们使用getStringExtra()方法从Bundle对象中获取数据,并将其设置到界面上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浮点运算误差

输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等) 解决这个问题首先需要表示aabb这个变量,只需要定义一个变量n存储即可,另一个问题就是如何判断n是否为完全平方数? 第一种思路是先求出…

【python学习】Python 线程编程(类内多线程编程)

Python线程编程(类内多线程编程) 文章目录 Python线程编程(类内多线程编程)多线程编程的函数Function级多线程编程class级多线程编程进阶 类内多线程 多线程可以同时执行一段代码的多个程序。使用多线程可能使程序运行速度更快。 …

前端常见Linux操作命令

压缩文件 压缩 dist文件为dist.tar.gz tar -czvf dist.tar.gz dist 解压文件 tar -xzvf dist.tar.gz 列出目前工作目录所含的文件及子目录 ls 显示当前目录中的所有文件和目录,包括隐藏文件 ls -a 显示文件和目录的详细信息 它以长格式显示目录内容,包…

【Python表白系列】无限弹窗,满屏表白代码来啦(完整代码)

文章目录 满屏表白代码环境需求完整代码详细分析系列文章 满屏表白代码 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需…

TypeScript 的安装与使用

npm i typescript -g依赖会安装 tsc 命令 tsc -v初始化 配置 tsc --init生成 tsconfig.json tsconfig.json 配置 要支持 import 模块语法的话 rollup的配置 target 选项需要设置 ES5 module 选项需要改成 es2015 esbuild 的配置 target: ESNext module: ESNext moduleReso…

rust中动态数组Vec的简单使用

在Rust中,Vector(简称Vec)是一个动态数组数据结构,它可以动态地增加或减少其容量。Vec是Rust标准库中的一个常见类型,非常适合用于存储和操作一系列相同类型的值。 Vec其实是一个智能指针,用于在堆上分配内…

2022年1月14日 Go生态洞察:Go 1.18 新教程探索

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

绩效考核管理项目|记录2

给界面添加筛选条件并且把搜索功能实现 这段代码写入搜索方法里面就能实现功能。 private void bingdgv(){//筛选项:用户名、职位代码、是否辞职string userName txtUserName.Text.Trim();int baseTypeId (int)base_cbx.SelectedValue;bool isStop isdel_ckb.Che…

苍穹外卖--订单状态定时处理

通过定时任务每分钟检查一次是否存在支付超时订单(下单后超过15分钟仍未支付则判定为支付超时订单),如果存在则修改订单状态为“已取消”通过定时任务每天凌晨1点检查一次是否存在“派送中”的订单,如果存在则修改订单状态为“已完…

【VMware相关】VMware vSphere存储方案

一、iSCSI存储 参考文档 VMware官方文档:配置iSCSI适配器和存储 华为配置指南:VMware ESXi下的主机连通性指南 1、配置说明 如下图所示,VMware配置iSCSI存储,需要将物理网卡绑定到VMKernel适配器上,之后再将VMKernel适…

Golang数据类型(数字型)

Go数据类型(数字型) Go中数字型数据类型大致分为整数(integer)、浮点数(floating point )和复数(Complex)三种 整数重要概念 整数在Go和Python中有较大区别,主要体现在…

opencv 图像边框

cv.copyMakeBorder() 图像设置边框或者填充

mybatis中<association> 和 <collection>

在 MyBatis 中&#xff0c;<association> 和 <collection> 是用于配置结果映射中关联关系的两个元素。 <association> 用于配置一对一的关联关系&#xff0c;表示两个对象之间的关系是一对一的。例如&#xff0c;一个订单对象关联一个用户对象&#xff0c;使…

大屏适配方案(vw、vh)

开发大屏主要是两方面的工作&#xff1a; 大屏之关键-前期的自适应适配根据 ui 稿绘制图表&#xff0c;调细节 方案实现方式优点缺点vw vh1.按照设计稿的尺寸&#xff0c;将px按比例计算转为vw和vh1.可以动态计算图表的宽高&#xff0c;字体等&#xff0c;灵活性较高 2.当屏幕…

PyQt基础_012_对话框类控件QInputDialog

基本操作 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class InputdialogDemo(QWidget):def __init__(self, parentNone):super(InputdialogDemo, self).__init__(parent)layout QFormLayout()self.btn1 QPushButton(&qu…

路由器Beacon帧和低功耗设备DTIM之间的关系

1. 路由器发送Beacon帧&#xff1a;路由器周期性地发送Beacon帧&#xff0c;用于广播网络的存在和参数信息。Beacon帧中包含了DTIM周期和DTIM计数器的值。 2. 设备监听Beacon帧&#xff1a;低功耗设备在休眠状态下会定期唤醒来监听路由器发送的Beacon帧。 3. DTIM计数器更新&…

springboot+java校园自助洗衣机预约系统的分析与设计ssm+jsp

洗衣服是每个人都必须做的事情&#xff0c;而洗衣机更成为了人们常见的电器&#xff0c;但是单个洗衣机价格不菲&#xff0c;如果每人都买&#xff0c;就会造成资源的冗余。所有就出现了公用设备&#xff0c;随着时代的发展&#xff0c;很多公用都开始向着无人看守的自助模式经…

如何访问电脑的组策略编辑器?

如何打开组策略 如果我们使用的是 Win 10 系统&#xff0c;如何打开组策略&#xff1f;下面为大家总结了四种打开组策略编辑器的方法。 从搜索框打开 Win 10 策略组怎么打开&#xff1f;一个简单快速的方法就是使用 Windows 自带的搜索栏。我们可以向搜索框中输入“编辑组策…

halcon中灰度图自动二值化

1、首先图片要先形成灰度图&#xff0c;如果下一句是二值化的那就删掉 dev_clear_window() read_image(Image, D:/desktop/tmpp/微信图片_20231201184731.png) * 转为灰度图 rgb1_to_gray(Image, GrayImage) 2、双击图像变量中的GrayImage 3、工具栏点击打开灰度直方图按钮&…

【数电笔记】基本和复合逻辑运算

说明&#xff1a; 笔记配套视频来源&#xff1a;B站 基本逻辑运算 1. 与运算 &#xff08;and gate&#xff09; 2. 或运算 &#xff08;or gate&#xff09; 3. 非运算 &#xff08;not gate &#xff09; 复合逻辑运算 1. 与非运算&#xff08;nand&#xff09; 2. 或非运…