【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对象中获取数据,并将其设置到界面上。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刘恋对话贾樟柯:焦虑往往是因为我们还有的选

11月29日,由房产服务国民品牌我爱我家与贾樟柯联合呈现的《住进每一种生活》,在乐迷和网友的热烈期盼下迎来了第三期。自首期节目在腾讯视频和极光TV播出以来,《住进每一种生活》频频在社交媒体上引发观众热议。 《住进每一种生活》以六位名…

指纹芯片的工作原理及应用领域详解

指纹芯片是一种利用指纹识别技术的电子设备,可以通过扫描人体指纹的纹理特征,将其转化为数字化信息并进行存储和识别。指纹芯片广泛应用于各个领域,包括智能手机、银行和金融、门禁系统、身份验证等,因其高度准确、快速便捷的特点,得到了广大用户的青睐。 指纹芯片的原理是基于…

从订阅式需求发展,透视凌雄科技DaaS模式增长潜力

订阅制,C端消费者早已耳熟能详,如今也凭借灵活、服务更新稳定的特点,逐渐成为B端企业服务的新热点。 比如对中小企业而言,办公IT设备等配套支出都必不可少,但收入本身并不稳定,购置大堆固定资产&#xff0…

【散列函数的构造方法(直接定址法 ==除留余数法==),散列表的查找(1.开放地址法,2.链地址法(拉链法))】

文章目录 散列函数的构造方法直接定址法除留余数法 散列表的查找1.开放地址法线性探测法二次探测法伪随机探测法 2.链地址法(拉链法) 散列表的查找效率 散列函数的构造方法 散列存储 选取某个函数,依该函数按关键字计算元素的存储位置。 Loc…

3.3 路由器的远程配置

实验3.3 路由器的远程配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施(一)、配置通过Telnet登录系统1.RA的基本配置2.RB的基本配置3.在RA上配置Telnet用户登录界面 (二)、配置通过STelnet登录系统1.RA的基本配…

SpringBoot 实现动态切换数据源,这样做才更优雅!

最近在做业务需求时,需要从不同的数据库中获取数据然后写入到当前数据库中,因此涉及到切换数据源问题。本来想着使用Mybatis-plus中提供的动态数据源SpringBoot的starter:dynamic-datasource-spring-boot-starter来实现。 结果引入后发现由于…

物联网实训室虚拟仿真软件建设方案

一、概述 物联网实训室虚拟仿真软件旨在紧密围绕立德树人的根本任务,充分依托先进的数字技术,并对接物联网行业的发展趋势和人才需求。通过对比真实企业工作环境,融合创新创业教育基因,秉承虚拟仿真技术与教育教学深度融合的理念&…

Linux系统iptables扩展

目录 一. iptables规则保存 1. 导出规则保存 2. 自动重载规则 ①. 当前用户生效 ②. 全局生效 二. 自定义链 1. 新建自定义链 2. 重命名自定义链 3. 添加自定义链规则 4. 调用自定义链规则 5. 删除自定义链 三. NAT 1. SNAT 2. DNAT 3. 实验 ①. 实验要求 ②. …

avue页面布局 api 引用

展示 index.vue <template><basic-container><avue-crud :option"option":table-loading"loading":data"data":page"page":permission"permissionList":search.sync"search":before-closebefore…

Linux信号超详细剖析

预备知识&#xff1a; 一、信号产生(OS发给进程) 1、键盘组合键 Linux中&#xff0c;一次登录对应一个终端&#xff0c;bash/shell。且只允许一个进程是前台进程&#xff0c;默认就是bash/shell&#xff0c;其它都是后台进程。获取键盘输入的是前台进程。 Ctrlc: 向前台进程…

KaiwuDB 亮相中国国际供应链促进博览会

11月28日&#xff0c;全球首个以供应链为主题的国家级展会——2023 中国国际供应链促进博览会&#xff08;简称“链博会”&#xff09;在北京盛大召开。KaiwuDB 受邀亮相大会&#xff0c;向与会者展示现代数据库技术在数字科技链条中的根基作用&#xff0c;其中分布式多模数据库…

mongodb连接工具

推荐几款熟悉的mongodb连接工具 mongoshellmongoCompassmongodbAtlasnosqlbooster 这四款连接工具中&#xff0c;mongoshell, mongoCompass, mongodbAtlas都是mongodb官网介绍和推荐的工具。好不好用先不说&#xff0c;这几款工具胜在官方提供&#xff0c;免费开源。无论使用怎…

Linux常用命令——axel命令

在线Linux命令查询工具 axel 多线程下载工具 补充说明 axel是Linux下一个不错的HTTP/ftp高速下载工具。支持多线程下载、断点续传&#xff0c;且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度。比如在国内VPS或服务器上…

代码级接口测试与单元测试的区别

关于接口测试 接口测试是一个比较宽泛的概念, 近几年在国内受到很多企业和测试从业者的追捧, 尤其是上层的UI在取悦用户的过程中迭代更新加快, UI自动化维护成本急剧上升的时代, 大家便转向了绕过前端的接口层面进行测试. 但是很多人, 对接口测试的理解并不完整, 事实上, 我们…

Neo4j 数据库运维与优化(头歌)

文章目录 第1关&#xff1a;Neo4j 运维与优化 &#xff08;企业版&#xff09;任务描述相关知识准备工作安装监控软件安装 Prometheus优化思路 本关要求测试说明题目答案 第1关&#xff1a;Neo4j 运维与优化 &#xff08;企业版&#xff09; 任务描述 本关任务&#xff1a;学…

Yocto版本信息查询

文章目录 yocto官方发布版本当前版本完整版本信息yocto与内核版本对应Yocto工程查找版本Yocto镜像查找版本启动串口打印系统配置参考yocto官方发布版本 当前版本 如下图所示,当前yocto的主要维护版本,几乎每年一年版本,当前为5.0版本 完整版本信息 从图可知,yocto项目…

AUTOSAR OS任务调度的底层逻辑

先参考 FreeRTOS的任务触发底层逻辑 简述RTOS任务调度底层逻辑 AUTOSAR-OS的调度机制-调度表&#xff08;没理解透&#xff0c;继续更新&#xff09; OSEK与FreeRTOS在任务调度上最大的区别在于&#xff0c;FreeRTOS是基于全抢占任务调度和时间片轮转调度机制&#xff0c;具有…

Golang 设置运行的cpu数与channel管道

介绍&#xff1a;为了充分了利用多cpu的优势&#xff0c;在Golang程序中&#xff0c;设置运行的cpu数目。 func main() {//获取系统当前cpu的数量num : runtime.NumCPU()//这里根据需求来设置整个go程序去使用几个cpuruntime.GOMAXPROCS(num)fmt.Println("num ", nu…

亚马逊云与生成式 AI 的融合——生成式AI的应用领域

文章目录 前言亚马逊云科技增强客户体验聊天机器人和虚拟助手亚马逊云科技 鸿翼&#xff1a;提供精准检索和问答&#xff0c;显著提升全球化售后服务体验AI 赋能的联络中心智能导购&个性化推荐智慧数字人 提升员工生成力和创造力对话式搜索亚马逊云科技 西门子&#xff1…

PTPX在report_power时报告Signal Unloading failed的原因分析

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 在使用PTPX报动态功耗的时候&#xff0c;pt_shell load session后使用read_fsdb来读取fsdb波形文件&#xff0c;结果报了Signal Unloading failed。 这个问题可能直接读fsdb文…