【安卓学习笔记】Activity的生命周期和加载模式

news2025/1/16 14:08:00

Activity的生命周期

Activity是安卓应用的重要组成单元之一,其对于安卓的作用类似于Servlet对于Web应用的作用。

整个Activity生命周期的图解如下

具体的生命周期可以总结成如下几个步骤

onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创建View,绑定数据和恢复数据。

onStart():当Activity显示在屏幕上时,函数被调用。

onRestart():Activity从停止状态进入活动状态是调用。

onResume():Activity可以接受用户输入时,该函数被调用,此时的activity位于activity栈的栈顶。

onPause():当Activity进入暂停状态时,该函数被调用,一般用来保存持久的数据或释放占用的资源。

onStop():当Activity变为不可见后,该函数被调用,Activity进入停止状态。

onDestroy():在Activity被终止前,被调用。

归纳起来,Activity大概会经历四种状态

运行状态:当前Activity位于前台,用户可见,可以获得焦点

暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点

停止状态:该Activity不可见,失去焦点

销毁状态:该Activity结束,或Activity所在的进程被结束

我们使用给一个程序来看一下看一下Activity的生命周期。程序非常简单,就是定义两个Activity,分别命名为FirstActivity和SecondActivity,先从FirstActivity跳转到SecondActivity,然后再在SecondActivity销毁该Activity,最后销毁FirstActivity

public class FirstActivity extends Activity {

    final String TAG = "-----FirstActivity-----";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first);
        // 输出日志
        Log.d(TAG, "-----onCreate-----");
        TextView textView = findViewById(R.id.text1);
        Button button1 = findViewById(R.id.bn_first1);
        Button button2 = findViewById(R.id.bn_first2);
        // 第一个按钮跳转到第二个Activity
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
        // 第二个按钮销毁该Activity
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirstActivity.this.finish();
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "-----onStart-----");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "-----onRestart-----");
    }

    @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.v(TAG, "-----onDestory-----");
    }
}
public class SecondActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        Button button = findViewById(R.id.bn_second);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SecondActivity.this.finish();
            }
        });
    }
}

 

最后得到的日志信息如下所示,我们过滤了其他日志,只保留FirstActivity的日志

Activity的加载模式

Activity一共有四种加载模式

standard:标准模式,这是默认的加载模式

singleTop:Task栈顶单例模式

singleTask:Task内单例模式

singleInstance:全局单例模式

安卓采用Task来管理多个Activity,当我们启动应用的时候,安卓就会位置创建一个Task,然后启动这个引用的入口Activity,(即<intent-filter>中配置为MAIN和LAUNCHER的Activity)。

我们可以将Task简单理解成存放Activity的栈,先加载的Activity位于栈底,后加载的Activity位于栈顶。

Activity的加载模式就是按照什么样的方式去实例化,加载Activity,并且控制Activity和Task之间的关系。

standard模式

当我们通过standard模式启动Activity的时候,每次都会创建一个新的Activity示例放置到栈顶。当我们在配置Activity时没有指定加载模式的时候,采用的就是standard模式。

singleTop模式

这种模式与standard模式基本相同,唯一不同的就是,当要启动的Activity已经位于栈顶的时候不会创建一个新的实例,而是复用已有的实例。如果我们的目标Activity不位于栈顶,那么还是会创建一个新的实例,这一点和standard模式是一样的。

singleTask模式

采用singleTask模式的Activity在同一个Task中只有一个实例,当系统采用singleTask模式启动目标Activity的时候,可分为如下三种情况

  1. 如果要启动的Activity实例不存在,系统会创建一个实例,并且将其置于栈顶

  2. 如果要启动的Activity实例位于栈顶,此时的操作与singleTop模式相同

  3. 如果要启动的Activity实例存在于栈中,但是没有位于栈顶,那么系统就会将该Activity上的所有Activity移出Task栈,从而使目标Activity转入栈顶

singleInstance模式

在这种加载模式下,系统保证无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来加载该Activity实例。

当系统采用singleInstance模式启动目标Activity时,可分为如下两种情况

  1. 如果要启动的目标Activity不存在,系统会创建一个全新的Task,再创建目标Activity的实例,并将它加入到新的Task栈顶

  2. 如果要启动的目标Activity已经存在,无论它位于哪个应用程序中,位于哪个Task中,系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来

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

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

相关文章

1819. 序列中不同最大公约数的数目

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个由正整数组成的数组 nums …

四信5G工业路由器全面支持中国移动研究院5G专网质量探针,满足5G专网高质保障需求

面向工业4.0时代&#xff0c;5G行业应用也在不断拓展&#xff0c;大量的5G专网兴起&#xff0c;“一业带百业”效果显著&#xff0c;截至2022年9月&#xff0c;我国5G行业虚拟专网数量已超过1万张&#xff0c;5G已在全国200余家智慧矿山、1700余家智慧工厂、250余个智慧电网项目…

SOFA Weekly|铜锁探「密」、本周贡献 issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

Shiro【授权、整合Spirng、Shiro过滤器】

前言 本文主要讲解的知识点有以下&#xff1a; Shiro授权的方式简单介绍与Spring整合初始Shiro过滤器 一、Shiro授权 上一篇我们已经讲解了Shiro的认证相关的知识了&#xff0c;现在我们来弄Shiro的授权 Shiro授权的流程和认证的流程其实是差不多的&#xff1a; 1.1Shiro支…

React相关扩展二(Fragment、Content、useContext、组件优化、render props、错误边界)(十)

系列文章目录 第一章&#xff1a;React基础知识&#xff08;React基本使用、JSX语法、React模块化与组件化&#xff09;&#xff08;一&#xff09; 第二章&#xff1a;React基础知识&#xff08;组件实例三大核心属性state、props、refs&#xff09;&#xff08;二&#xff0…

本周推荐 | AB实验低响应情景解决实践

推荐语&#xff1a;本文针对AB实验低响应情景下的增量效果不显著问题&#xff0c;提出通过倾向得分匹配方案来衡量策略增量效果的方法&#xff0c;并将相关方案融入一休平台科学评估体系中。文章理论与实践相结合&#xff0c;深入浅出&#xff0c;强烈推荐。——大淘宝技术数据…

9个非常有趣的HTML5 Canvas动画特效合集

HTML5技术正在不断的发展和更新&#xff0c;越来越多的开发者也正在加入HTML5阵营&#xff0c;甚至在移动开发上HTML5的地位也是越来越重要了。HTML5中的大部分动画都是通过Canvas实现&#xff0c;因为Canvas就像一块画布&#xff0c;我们可以通过调用脚本在Canvas上绘制任意形…

计算机视觉OpenCv学习系列:第一部分、绪论

第一部分、绪论第一节、计算机视觉发展历程1.计算机视觉发展历史2.计算机视觉的主要任务3.计算机视觉的应用场景第二节、计算机视觉框架1.早期计算机视觉框架概述2.当前主流的框架与路线3.计算机视觉框架的未来趋势第三节、OpenCV框架1.OpenCV的发展历史2.OpenCV模块架构3.Open…

深入理解Disruptor

Disruptor通过缓存行填充&#xff0c;利用CPU高速缓存&#xff0c;只是Disruptor“快”的一个因素&#xff0c;快的另一因素是“无锁”&#xff0c;尽可能发挥CPU本身的高速处理性能。 1 缓慢的锁 Disruptor作为一个高性能的生产者-消费者队列系统&#xff0c;核心就是通过Ri…

面向对象的好处

提到面向对象的好处&#xff0c;一些人脑中可能会冒出&#xff1a;封装继承多态封装 封装&#xff1a;通过类&#xff0c;为数据和方法&#xff0c;提供统一的上下文 但是&#xff0c;函数名&#xff0c;同样也可以提供上下文&#xff0c;并且可以通过一种叫柯里化的技巧&…

比特位计数[动态规划 || bitCount计数]

二进制计数前言一、二进制计数二、动态规划 & bitCount分治统计1、bitCount分治统计2、动态规划总结参考文献前言 二进制计数可以直接基于分治去快速统计&#xff0c;如果是连续数的二进制计数&#xff0c;可以利用前面已经计算出的状态进行递推求解&#xff0c;即动态规划…

Python NumPy 连接数组

前言NumPy&#xff08;Numerical Python的缩写&#xff09;是一个开源的Python科学计算库。使用NumPy&#xff0c;就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数&#xff0c;涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍Python NumPy 连接数组…

使用Java为何总写出C风格的代码?

“你看你所有代码都是把字段取出来计算&#xff0c;然后&#xff0c;再塞回去。各种不同层面的业务计算混在一起&#xff0c;将来有一点调整&#xff0c;所有代码都得跟着变。” 在实际的开发过程中&#xff0c;有不少人都这么写代码的。Java写的代码应该有Java的风格&#xf…

Karl Guttag:Quest Pro透视效果差,并不适合商用

AR/VR光学专家Karl Guttag曾指出&#xff0c;基于VST透视的AR虽然绕开了光学透视AR的一些局限&#xff0c;但VST透视依然存在运动延迟、余光视觉透视效果、分辨率、IPD不匹配等多种问题。的确&#xff0c;VST透视AR的结构、原理比光学透视AR更简单&#xff0c;但它同样需要解决…

(二十)正则表达式

目录 前言: 1.概述: 2.正则表达式体验: 3.正则表达式字符 4.正则表达式在字符串方法中的使用 5.代码演示: 6.正则表达式支持爬取信息 7.代码演示: 前言: 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regex…

SpringCloud-Netflix学习笔记05——Eureka模拟实现简单集群

前言 对于Eureka注册中心来说&#xff0c;如果只有一个注册中心的话&#xff0c;如果注册中心崩了&#xff0c;那么里面的服务全部用不了&#xff0c;系统就会崩溃。为了避免这个问题&#xff0c;我们可以搭建一个注册中心的集群&#xff0c;几个注册中心互相关联&#xff0c;如…

程序员别死背面试八股文了,这种面试题才是未来主流。。。

目录&#xff1a; 面试官为啥要出这样一个开放式问题生产消费模型及核心数据结构支撑TB级数据写入的分布式架构数据宕机场景下的高可用架构支持数据不丢失的ack机制最后的总结 1、面试官为啥要出这样一个开放式问题 这篇文章简单给大家来聊一个互联网大厂的Java面试题&#x…

【Git 从入门到精通】一文摸透Git中的分支操作

文章目录一、什么是分支&#xff1f;二、分支中的常用命令三、上手分支1.查看分支2.创建分支3.修改分支4.切换分支5.合并分支6.解决冲突四、分支操作原理分析一、什么是分支&#xff1f; 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们…

肠道核心菌——戴阿利斯特杆菌属 (Dialister)

谷禾健康 戴阿利斯特杆菌属 &#xff08;Dialister&#xff09; ✦ Dialister&#xff08;戴阿利斯特杆菌属&#xff09;是小的、厌氧或微需氧的革兰氏阴性球状或杆状菌&#xff0c;因次也被翻译成小杆菌属。 Dialister菌是人体肠道菌群中的一种常见菌种。该菌属物种被发现出现…

基于 Hutool 的抽奖实现与原理

前言 先大概描述下 hutool 工具是如何根据权重进行抽取&#xff0c;后面再结合源码进行讲解。 假设有如下奖品以及对应的权重&#xff1a; 奖品名称权重奖品数量谢谢参与0.76010积分0.4550IPhone 140.055Mac Book Air0.011 需要注意 谢谢参与 也算是一种奖品&#xff0c;因为…