Activity

news2025/2/24 3:52:25

Activity生命周期图

官网的 Activity 的生命周期图:
在这里插入图片描述
在官方文档中给出了说明,不允许在 onPause() 方法中执行耗时操作,因为这会影响到新 Activity 的启动。

常见情况下Activity生命周期的回调

(A 与 B 表示不同的 Activity )

情况回调
第一次启动onCreate() -> onStart() -> onResume()
从 A 跳转到 BA_onPause() -> B_onCreate() -> B_onStart() -> B_onResume() -> A_onStop()
从 B 再次回到 AB_onPause() -> A_onRestart() -> A_onStart() -> A_onResume() -> B_onStop()
用户按 home 键onPause() -> onStop()
按 home 键后回到应用onRestart() -> onStart() -> onResume()
用户按电源键屏保onPause() -> onStop()
用户按电源键亮屏onRestart() -> onStart() -> onResume()
用户按 back 键回退onPause() -> onStop() -> onDestroy()

关于Activity生命周期常见问题

问题回调
由活动 A 启动活动 B时,活动 A 的 onPause() 与 活动 B 的 onResume() 哪一个先执行?活动 A 的 onPause() 先执行,活动 B 的 onResume() 方法后执行
标准 Dialog 是否会对生命周期产生影响没有影响
全屏 Dialog 是否会对生命周期产生影响没有影响
由活动 A 启动活动 B时,主题为 Dialog 的B Activity 是否会对生命周期产生影响有影响, A.onPause -> B.onCrete -> B.onStart -> B.onResume

Activity如果中途被回收了,再次启动是如何恢复原始数据的?

Activity类中提供了onSaveInstanceState()回调方法,这个方法可以保证活动在被回收之前一定会被调用,因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。

以下面项目为例:
在MainActivity中添加如下代码就可以就可以将临时数据进行保存。

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    String tempData = "save data";
    outState.putString("data_key", tempData);
}

数据是已经保存下来的,那么我们该如何恢复呢?修改MainActivity中的onCreate()方法

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    if(savedInstanceState !=null){
        String tempData=savedInstanceState.getString("data_key");
        Log.d(TAG,tempData);
    }
}

一些问题:
关于 onSaveInstanceState 与 onRestoreInstanceState 方法需要注意的一些问题:

  1. onSaveInstanceState 方法的调用时机是在 onStop 之前,与 onPause 没有固定的时序关系。而 onRestoreInstanceState 方法则是在 onStart 之后调用。

  2. 正常情况下的活动销毁并不会调用这两个方法,只有当活动异常销毁并且有机会重现展示的时候才会进行调用,除了资源配置的改变外,activity 因内存不足被销毁也是通过这两个方法保存数据。

  3. 在 onRestoreInstanceState 和 onCreate 都可以进行数据恢复工作,但是根据官方文档建议采用在 onRestoreInstanceState 中去恢复。

  4. 在 onSaveInstanceState 和 onRestoreInstanceState 这两个方法中,系统会默认为我们进行一定的恢复工作,具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复付 UI 所做的任何可见更改。例如 EditText 中的文本信息、ListView 中的滚动位置等。也可以通过 android:saveEnabled 属性设置为 “false” 或通过调用 setSaveEnabled() 方法显式阻止布局内的视图保存其状态,通常不会将该属性停用,除非想要以不同方式恢复 Activity IU 的状态。

  5. onSveInstanceState() 常见的触发场景有:横竖屏切换、按下电源键、按下菜单键、切换到别的 Activity 等;onRestoreInstanceState() 常见的触发场景有:横竖屏切换、切换语言等等。

Activity的四种启动模式

一、相关知识

1.一个应用程序通常会有多个Activity,这些Activity都有一个对应的action(如MainActivity的action),可通过action来启动对应Activity(隐式启动)。

<action android:name="android.intent.action.MAIN" />

2.一个应用程序可以说由一系列组件组成,这些组件以进程为载体,相互协作实现App功能。

3.任务栈(Task Stack)或者叫退回栈(Back Stack)介绍:

任务栈用来存放用户开启的Activity
在应用程序创建之初,系统会默认分配给其一个任务栈(默认一个),并存储根Activity
同一个Task Stack,只要不在栈顶,就是onStop状态
任务栈的id自增长型,是Integer类型
新创建Activity会被压入栈顶。点击back会将栈顶Activity弹出,并产生新的栈顶元素作为显示界面(onResume状态)
当Task最后一个Activity被销毁时,对应的应用程序被关闭,清除Task栈,但是还会保留应用程序进程,再次点击进入应用会创建新的Task栈。

4.Activity的affinity:

affinity是Activity内的一个属性(在ManiFest中对应属性为taskAffinity)。默认情况下,拥有相同affinity的Activity属于同一个TaskTask也有affinity属性,它的affinity属性由根Activity(创建Task时第一个被压入栈的Activity)决定
在默认情况下,所有的Activity的affinity都从Application继承。也就是说Application同样有taskAffinity属性
Application默认的affinity属性为Manifest的包名。

二、Activity启动模式:

1.默认启动模式——standard
Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中:

2.栈顶复用模式——singleTop
在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity。

3.栈内复用模式——singleTask
与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,将task内的对应Activity实例之上的所有Activity弹出栈, 将对应Activity置于栈顶,获得焦点。

4.全局唯一模式——singleInstance
在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。 如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)

三、动态设置启动模式

上述所有情况,在Manifest中通过launchMode属性设置,被称为静态设置,动态的设置Activity启动方式(如果同时有动态和静态设置,那么动态的优先级更高)。

动态设置是通过设置要启动的Activity的启动模式:

intent.setFlags(...);

几个常见的Flag:

1、NEW_TASK

Intent.FLAG_ACTIVITY_NEW_TASK

与singleInstance很相似:在给目标Activity设立此Flag后,会根据目标Activity的affinity进行匹配,如果已经存在与其affinity相同的task,则将目标Activity压入此Task。 反之没有的话,则新建一个task,新建的task的affinity值与目标Activity相同。然后将目标Activity压入此栈。

2、SINGLE_TOP

Intent.FLAG_ACTIVITY_SINGLE_TOP

与静态设置中的singleTop效果相同

3.CLEAR_TOP

Intent.FLAG_ACTIVITY_CLEAR_TOP

与singleTask相似当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,如果有,就将位于Task中的对应Activity其上的所有Activity弹出栈,此时有以下两种情况:

如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
没有设置,则将栈内的对应Activity销毁重新创建。

由FirstActivity启动SecondActivity最佳写法

在android的APP中Intent的跳转时最常用的方法之一。在这里我对Intent的跳转进行了整理,实现了比较好用的一种写法。

理由:传参数时直接调用方法就知道传什么参数了,有效防止漏传。

修改 SecondActivity 中的代码,如下所示:

public class SecondActivity extends BaseActivity {
    public static void actionStart(Context context, String data1, String data2) {
        Intent intent = new Intent(context, SecondActivity.class);
        intent.putExtra("param1", data1);
        intent.putExtra("param2", data2);
        context.startActivity(intent);
    }
    ……
}

在FirstActivity调用即可启动SecondActivity

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
    }
});

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

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

相关文章

(硬件设计)老工程师的经验之道

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言1、用蜡烛油固定电位器2、电路板接插件用彩色接插件前言 送给大学毕业后找不到奋斗方向的你&#xff08;每周不定时…

Python----科学计数法、同时给多个变量赋值、eval函数、math库函数、复数(complex())、内置的数值运算函数、内置的数值运算操作符

科学计数法使用字母"e"或者“E”作为幂的符号&#xff0c;以10为基数&#xff0c;科学计数法的含义如下&#xff1a; 96e4&#xff1a;96乘10的4次幂 4.3e-3&#xff1a;4.3乘10的负三次幂 aeb&#xff1a;a*10*b 同时给多个变量赋值格式: 变量1&#xff0c;变量2表…

基于Python的电影推荐系统

电影推荐系统 目录 电影推荐系统 1 数据描述 1变量说明 1程序介绍 2 本次课程作业在 small-movielens 数据集的基础上&#xff0c;对用户、电影、评分数据进行了处理&#xff0c;然后根据 Pearson 相关系数计算出用户与其他用户之间的相似度&#xff0c;根据相似度进行推荐和…

用Python来表白,把情书写进她的照片里

前言 这不已经十一月了&#xff0c;22年马上就过完了&#xff0c;各位兄弟有对象了吗&#xff0c;现在就是缺钱还缺对象 退一步来说&#xff0c;有心仪的人吗啊&#xff0c;如果有的话&#xff0c;看看这篇 程序员的表白小妙招吧 实现步骤 想要实现把情书写在像素中&#xf…

【Web-HTML基础】颜色赋值、背景图片、文本和字体相关样式、元素的显示方式display、盒子模型、部分标签自带外边距或内边距

目录 颜色赋值 背景图片 文本和字体相关样式 元素的显示方式display 盒子模型 盒子模型之content内容 盒子模型之margin外边距 盒子模型之border边框 盒子模型之padding内边距 部分标签自带外边距或内边距 综合代码实现 颜色赋值 三原色: 红绿蓝 RGB RedGreenBlue …

【2022秋招面经】——深度学习

文章目录请写出常用的损失函数&#xff0c;平方损失、交叉熵损失、softmax损失函数和hinge1. 0-1 损失函数2. 绝对值损失函数3. 平方损失函数4. log 对数损失函数5. 指数损失函数&#xff08;exponential loss&#xff09;6. Hinge 损失函数7. 感知损失(preceptron loss)函数8.…

网课查题接口系统使用教程

网课查题接口系统使用教程 本平台优点&#xff1a;免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a;题库后台http://daili.jueguangzhe.cn/…

使用微服务实现多设备自动调度

在实现app自动化过程中&#xff0c;有时候我们需要将多个手机中的任务&#xff0c;按照某种规则进行调度&#xff0c;这时仅仅使用移动端的脚本就无法完成了&#xff0c;需要配合使用微服务来完成。下面就举个例子来实际说明如何使用。 需求 假设我们有100台手机做任务&#…

计算机毕业设计(附源码)python疫情下的学生出入管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

云IDE产品介绍

前言 CSDN开发云官网发布了最新产品【云IDE】产品&#xff01;【云IDE】将提供一键秒级构建云开发环境&#xff0c;是专为开发者打造的一款低代码开发产品&#xff0c;云端预制了常见的开发环境&#xff0c;无需下载安装&#xff0c;一键创建项目&#xff0c;灵活配置代码仓和云…

【数据库05】玩转SQL的高阶特性

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;相当硬核&#xff0c;黑皮书《数据库系统概念》读书笔记&#xff0c;讲解&#xff1a; 1.数据库系统的基本概念(数据…

22.10.31补卡 22CCPC桂林C题

Problem - C - Codeforces 这题题解是请教了学长之后才做出来的, 若是想看题解请看http://t.csdn.cn/unAyg 本篇文章只作为做题记录 写了一天半...感觉自己是不太适合写区域赛的题了, 还是多学学算法和数论好了 ---------------------------------------------------------…

学习笔记-NTLM中继

NTLM中继 免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关. NTLM hash 分为 NTLMv1 NTLMv2 NTLMv2 session 三种&#xff0c;NTLMv2 的强度比 NTLMv1 强了不少 &#xff0c;我们在实战中&#xff0c;如果获得的是 …

【Android Studio学习】第一篇、制作一个拥有登录和注册功能的简易APP

目录 第一部分、前言 1、目标效果 2、准备知识 第二部分、详细步骤 1、新建Empty工程 ​2、添加资源文件 3、搭建注册界面 4、搭建登录界面 5、编写注册界面和登录界面的代码 6、设置APP初始界面 7、连接手机&#xff0c;编译工程 第三部分、总结 1、参考资料 2、…

基于反馈技术的宽带低噪声放大器的设计

低噪声放大器是通信、雷达、电子对抗及遥控遥测系统中的必不可少的重要部件&#xff0c;它位于射频接收系统的前端&#xff0c;主要功能是对天线接收到的微弱射频信号进行线性放大&#xff0c;同时抑制各种噪声干扰&#xff0c;提高系统的灵敏度。特别是随着通信、电子对抗、微…

基于Java+Vue+uniapp微信小程序实现餐厅校园订餐平台

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅&#x1f447;&#x1f…

springboot二手车交易系统

功能介绍 目 录 第一章 绪论 5 1.1研究背景 5 1.2平台现状分析 5 1.3系统实现的功能 5 1.4二手车交易管理信息系统的特点 6 1.5本文的组织结构 6 第二章开发技术与环境配置 7 2.1 SpringBoot框架 7 2.2Java语言简介 7 2.3 MySQL环境配置 8 2.4 MyEclipse环境配置 8 2.5 mysql数…

黑马程序员C++类和对象【5】 —— 运算符重载(蓝桥杯必备知识)万字超详解

目录 &#x1f921;加号运算符重载 &#x1f921;左移运算符重载 &#x1f921;递增运算符重载 &#x1f921;递减运算符重载 &#x1f921;赋值运算符重载 &#x1f921;关系运算符重载 &#x1f921;函数调用运算符重载&#xff08;仿函数&#xff09; &#x1f921;加…

牛客竞赛每日俩题 - 动态规划1

目录 DP入门&#xff08;存储之前状态以简化&#xff09; DP解决最短路问题 DP入门&#xff08;存储之前状态以简化&#xff09; 拆分词句_牛客题霸_牛客网 思路&#xff1a; 方法&#xff1a;动态规划 状态&#xff1a; 子状态&#xff1a;前1&#xff0c;2&#xff0c;3&a…

蓝桥杯国奖一等奖,经历回顾

文章目录1. 自我介绍2. 参赛经历3. 我的一些经验4. 结语本篇内容为一位粉丝的投稿内容&#xff0c;希望对大家有所帮助。 1. 自我介绍 我是来自一所普通双非的大三学生&#xff0c;以下为主要成绩: 2022蓝桥杯Java组&#xff0c;全国一等奖2022高教社杯全国大学生数学建模竞赛…