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

news2025/1/8 6:21:12

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.coloradmin.cn/o/1275240.html

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

相关文章

c题目13:验证100以内的数是否满足哥德巴赫猜想。(任一大于2的偶数都可以写成两个质数之和)

每日小语 活下去的诀窍是:保持愚蠢,又不能知道自己有多蠢。——王小波 自己思考 即要让第一个质数与这个数减去第一个质数的值都为质数,所以要满足几个条件 1.abc 2.a为质数 3.b为质数 这里是否可以用到我之前刚学的自己设置的那个判断…

matlab 混沌动力学行为-分岔图-李雅普指数等

1、内容简介 略 24-可以交流、咨询、答疑 2、内容说明 混沌动力学行为-分岔图-李雅普指数等 包含各种类型的混沌模型求解,包含其分叉图、李雅普指数等 混沌、分叉图、李雅普指数 3、仿真分析 略 4、参考论文 略 链接:https://pan.baidu.com/…

MySQL之性能分析和系统调优

MySQL之性能分析和系统调优 性能分析 查看执行计划 EXPLAIN EXPLAIN作为MySQL的性能分析神器,可以用来分析SQL执行计划,需要理解分析结果可以帮助我们优化SQL explain select … from … [where ...]TABLE 表名 查询的每一行记录都对于着一张表 id 该…

CCC数字车钥匙(八)——BLE配对相关字段

2.1 配对连接协议 2.1.3 所有者配对广播 对于所有者配对,仅支持Legacy LE 1M PHY。ADV_IND需要按照Section 2.3.1.1 Volume 6 Part B。 事件类型:无指向可连接和可扫描。 ADV_IND中包含广播地址和广播数据,如下所示,其中广播地址…

火狐插件(附加组件)发布流程

1、进入开发者中心 开发者中心 :: Firefox 附加组件https://addons.mozilla.org/zh-CN/developers/ 路径: 2、首次使用会自动打开注册登录页 3、注册登录后点击 提交你的第一个附加组件 4、此时需要进行两步验证 5、点击身份验证应用 在打开的页面中根据个人实际…

外包搞了3年,感觉技术退步很明显......

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

数据结构-错题整理(1)-23/11/27

一: 题目: 广义表即我们通常所说的列表(lists)。它放松了对表元素的原子性限制,允许他们有自身结构。那么广义表E((a,(a,b),((a,b),c)))的长度和深度分别为? 答案为1和4 知识点: 广义表的长度和深度 长…

【RT-DETR改进】InnerIoU思想结合传统 EIoU、SIoU、WIoU损失思想(小目标涨点效果明显)

论文地址:官方Inner-IoU论文地址点击即可跳转 官方代码地址:官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址: 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…

卡码网15 .链表的基本操作III

链表的基础操作III 时间限制:1.000S 空间限制:128MB 题目描述 请编写一个程序,实现以下链表操作:构建一个单向链表,链表中包含一组整数数据。 1. 实现在链表的第 n 个位置插入一个元素,输出整个链表的…

有IP没有域名可以申请证书吗?

一、IP证书是什么? ip证书是用于公网ip地址的SSL证书,与我们通常所讲的SSL证书并无本质上的区别,但由于SSL证书通常颁发给域名,而组织机构需要公共ip地址的SSL证书,这类SSL证书就是我们所说的ip证书。ip证书具有安全、…

C++ 学习 之 类的初始化与逗号运算符的联动

我们来看一个代码 class A { public:A(int x) {cout << "123" << endl;}A(int x, int y) {cout << "456" << endl;}}a (1, 2); int main() {} 这个代码的输出结果是什么&#xff1f; 答案是 123 因为编译器把 ( 1 , 2 ) 识别…

mysql区分大小写吗

mysql在windows下默认是不区分大小写的&#xff0c;在linux下默认是区分大小写的。 所以&#xff0c;为了避免出问题&#xff0c;许多公司的数据库编程规范中明确规定&#xff1a;库名、表名、列名、索引名一律小写&#xff0c;不同单词之间以下划线分割&#xff0c;且控制在3…

Python+Requests模块添加cookie

请求中添加cookies 对于某些网站&#xff0c;登录然后从浏览器中获取cookies&#xff0c;以后就可以直接拿着cookie登录了&#xff0c;无需输入用户 名密码。 一、在参数中添加cookie 在发送请求时使用cookies 代码示例&#xff1a; import requests # 1&#xff0c;在参数…

如何选择 Facebook 代理?

Facebook上从事业务推广、广告或资料推广以及群组的用户需要高质量且可靠的代理。使用代理&#xff0c;用户可以在账号被封锁的情况下访问自己的资料&#xff0c;同时与多人进行即时通信&#xff0c;并能够&#xff1a; 自动发送邀请参加各种活动&#xff1b; 通过特殊的机器人…

Java流处理之序列化和打印流

文章目录 序列化概述ObjectOutputStream类构造方法序列化操作 ObjectInputStream类构造方法反序列化操作1**反序列化操作2** 案例&#xff1a;序列化集合案例分析案例实现 打印流概述PrintStream类构造方法改变打印流向 序列化 概述 Java 提供了一种对象序列化的机制。用一个…

无人巡检 | AIRIOT变电站无人机运防一体管理解决方案

传统的变电站安全管理存在着人力成本高、效率低、安全风险难以全面控制等问题&#xff0c;主要依靠人工巡检和监控设备&#xff0c;往往存在如下的运维问题和管理痛点&#xff1a; 巡检监控能力差&#xff1a;传统变电站管理系统无法对变电站进行全面的巡检监控&#xff0c;以…

使用Xshell启动远程服务器上的tensorboard:本地浏览器打开

在远程服务器上启动的tensorboard产生的localhost网址用本地浏览器一般不能直接打开&#xff0c;我们需要建立本地PC与远程服务器的通信&#xff0c;将tensorboard的映射端口与本地端口连接起来&#xff08;参考解决方案&#xff09;。 一、连接远程服务器设置 二、添加SSH隧道…

SSM项目实战-service实现

1、SysUserService.java package com.atguigu.schedule.service;import com.atguigu.schedule.pojo.SysUser;public interface SysUserService {SysUser getSysUser(SysUser sysUser); }2、SysUserServiceImpl.java package com.atguigu.schedule.service.impl; import com.atg…

7nm项目之顶层规划——01数据导入

1.创建workspace 创建workspace后&#xff0c;在其目录下产生。 CORTEXA53.json文件是将有默认配置的文件master.json、有library的.config.json文件、tunes下CORTEXA53.tunes.json文件合并 注&#xff1a;tunes下的CORTEXA53.tunes.json文件可以覆盖一些master.json的设置…

Vue+Element-ui实例_在form中动态校验tag标签

1.开发需求 在日常开发中&#xff0c;我们会遇到form表单的动态添加和校验&#xff0c;当我们需要在动态添加的内容中再次动态使用输入框的时候&#xff0c;就会变得很繁琐&#xff0c;我在网上找了很多案例&#xff0c;没有符合自己需求的内容&#xff0c;只好闲暇时间自己搞…