Android笔试面试题AI答之Activity(2)
答案仅供参考,大部分为文心一言AI作答
目录
- 1. 请介绍一下Activity 生命周期?
- 1. 完全生命周期
- 2. 可见生命周期
- 3. 前台生命周期
- 4. 配置更改
- 5. 特殊场景
- 2. 请介绍一下横竖屏切换时Activity的生命周期变化?
- 1.默认行为(未设置`android:configChanges`)
- 2.设置`android:configChanges`
- 3.使用`onConfigurationChanged(Configuration newConfig)`
- 3. 两个Activity之间跳转时会执行的方法有哪些?
- 1. 发起跳转的Activity(源Activity)
- 2. 目标Activity
- 3. 当目标Activity需要返回数据给源Activity时
- 4. 源Activity接收返回数据
- 4. 如何处理可能被系统回收的后台Activity?
- 1. 理解Activity生命周期
- 2. 使用`onSaveInstanceState(Bundle outState)`保存状态
- 3. 在`onCreate(Bundle savedInstanceState)`或`onRestoreInstanceState(Bundle savedInstanceState)`中恢复状态
- 4. 处理配置更改
- 5. 使用ViewModel和LiveData(对于更复杂的状态管理)
1. 请介绍一下Activity 生命周期?
Activity 的生命周期是 Android 开发中一个非常核心的概念,它定义了 Activity 从创建到销毁的各个阶段。理解 Activity 的生命周期对于编写高效、稳定的 Android 应用至关重要。以下是 Activity 生命周期的详细介绍:
1. 完全生命周期
Activity 的完全生命周期从它被创建开始,到它被销毁结束。这个过程中,Activity 会经历以下关键阶段:
-
onCreate(Bundle savedInstanceState): 当 Activity 第一次被创建时调用。这是初始化 Activity 的好地方,比如设置布局文件、初始化成员变量等。
savedInstanceState
参数包含了 Activity 之前的保存状态(如果有的话),通常用于在配置更改(如屏幕旋转)后恢复 Activity 的状态。 -
onStart(): 当 Activity 对用户可见时调用。此时 Activity 还没有位于前台,无法与用户交互。
-
onResume(): 当 Activity 可见且位于前台、开始与用户交互时调用。此时 Activity 处于运行状态。
-
onPause(): 当 Activity 被其他 Activity 覆盖或部分遮挡、即将失去焦点时调用。这是进行清理工作(如停止动画、停止播放音乐等)的好地方,但通常不会在这里保存持久化数据,因为 Activity 仍然可能会回到前台。
-
onStop(): 当 Activity 完全不可见时调用。如果 Activity 正在被销毁,或者另一个 Activity(无论是新的 Activity 还是之前存在的 Activity)完全覆盖了它,则会发生这种情况。
-
onDestroy(): 当 Activity 被销毁时调用。这是清理资源(如取消注册广播接收器、解绑服务等)的最后机会。
2. 可见生命周期
可见生命周期指的是 Activity 从对用户可见到完全不可见的阶段,包括 onStart()
、onResume()
、onPause()
和 onStop()
方法。
-
onStart() 和 onStop(): 这两个方法标记了 Activity 是否对用户可见。
-
onResume() 和 onPause(): 这两个方法标记了 Activity 是否位于前台并可以与用户交互。
3. 前台生命周期
前台生命周期指的是 Activity 位于前台、用户可以与其交互的阶段,包括 onResume()
和 onPause()
方法。这是 Activity 生命周期中最重要的一部分,因为大多数与用户的交互都发生在这个阶段。
4. 配置更改
当设备配置发生更改(如屏幕旋转)时,默认情况下,当前 Activity 会被销毁并重新创建,以匹配新的配置。但是,你可以通过重写 onSaveInstanceState(Bundle outState)
和 onRestoreInstanceState(Bundle savedInstanceState)
方法来保存和恢复 Activity 的状态,从而避免在配置更改时丢失数据。
5. 特殊场景
-
onRestart(): 当 Activity 从停止状态重新启动时调用。这通常发生在用户返回到之前已停止的 Activity 时。
-
onNewIntent(Intent intent): 当 Activity 已经存在(即已经在任务栈中),并且用户再次通过某种方式(如通过 Intent 启动器)启动它时调用。此时,Activity 的
onCreate()
和onStart()
方法不会被调用,但会调用onNewIntent()
方法,并将新的 Intent 作为参数传递给它。
了解 Activity 的生命周期对于编写能够正确响应各种用户操作和配置更改的 Android 应用至关重要。通过合理利用生命周期的各个阶段,你可以确保你的应用既高效又稳定。
2. 请介绍一下横竖屏切换时Activity的生命周期变化?
在Android中,当设备的屏幕方向(横屏与竖屏)发生变化时,默认情况下,当前Activity会被销毁并重新创建,以适应新的屏幕配置。这个过程中,Activity的生命周期会经历一系列的变化。不过,这个行为可以通过在AndroidManifest.xml中对Activity的android:configChanges
属性进行设置来修改,从而避免Activity的重新创建。
1.默认行为(未设置android:configChanges
)
当屏幕方向变化时,Activity的生命周期变化如下:
- onPause():Activity即将失去焦点,但尚未完全停止。
- onSaveInstanceState(Bundle outState):在Activity即将被销毁之前调用,允许你保存Activity的当前状态。这个状态会在Activity重新创建时通过
onCreate(Bundle savedInstanceState)
或onRestoreInstanceState(Bundle savedInstanceState)
方法恢复。 - onStop():Activity不再可见。
- onDestroy():Activity正在被销毁。
- onCreate(Bundle savedInstanceState):Activity被重新创建。如果之前保存了状态,则
savedInstanceState
参数将包含之前的状态。 - onStart():Activity再次变得可见。
- onResume():Activity回到前台,准备与用户交互。
2.设置android:configChanges
如果你不想在屏幕方向变化时让Activity重新创建,可以在AndroidManifest.xml的<activity>
标签中设置android:configChanges
属性,包括orientation
值。这样,当屏幕方向变化时,Activity将不会销毁并重新创建,而是会调用onConfigurationChanged(Configuration newConfig)
方法。
例如:
<activityandroid:name=".MyActivity"android:configChanges="orientation|keyboardHidden|screenSize">...
</activity>
注意:从Android 3.2(API级别13)开始,screenSize
也必须包含在android:configChanges
中,以确保在屏幕方向变化时Activity不会重新创建。
3.使用onConfigurationChanged(Configuration newConfig)
当设置了android:configChanges
并包含orientation
时,你需要重写onConfigurationChanged(Configuration newConfig)
方法来处理屏幕方向变化。在这个方法中,你可以根据新的配置(如屏幕方向)来更新Activity的布局或资源。
@Override
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);// 检查屏幕方向if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {// 现在是横屏} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){// 现在是竖屏}// 更新布局或资源
}
总之,屏幕方向变化时Activity的生命周期变化取决于你是否在AndroidManifest.xml中设置了android:configChanges
属性。未设置时,Activity会经历销毁和重新创建的过程;设置了则只会调用onConfigurationChanged(Configuration newConfig)
方法。
3. 两个Activity之间跳转时会执行的方法有哪些?
两个Activity之间跳转时,会涉及到一系列的方法调用,这些方法主要围绕Activity的生命周期和Intent的使用。以下是两个Activity之间跳转时可能会执行的主要方法:
1. 发起跳转的Activity(源Activity)
- onPause():当Activity即将因为另一个Activity的启动而失去用户焦点时调用。此时,源Activity不再接受用户输入,但系统不会立即销毁它。
- onSaveInstanceState(Bundle outState)(可选):在Activity即将被销毁之前调用,用于保存Activity的当前状态(如用户输入的数据)。这些数据会在Activity重新创建时通过
onCreate(Bundle savedInstanceState)
或onRestoreInstanceState(Bundle savedInstanceState)
方法恢复。然而,如果跳转是通过startActivityForResult()
发起的,并且没有配置android:configChanges
来避免Activity重新创建,那么这个方法在屏幕方向变化导致的Activity重建时也会被调用,但在此处的上下文中,它主要与Activity的保存和恢复状态相关。 - startActivity(Intent intent) 或 startActivityForResult(Intent intent, int requestCode):用于启动目标Activity。如果不需要从目标Activity接收结果,则使用
startActivity(Intent intent)
;如果需要接收结果,则使用startActivityForResult(Intent intent, int requestCode)
,其中requestCode
是一个请求码,用于在onActivityResult(int requestCode, int resultCode, Intent data)
中识别是哪个请求返回了结果。
2. 目标Activity
- onCreate(Bundle savedInstanceState):当Activity第一次被创建时调用。这是初始化Activity的好地方,比如设置布局文件、初始化成员变量等。如果Activity之前被销毁并保存了状态,则
savedInstanceState
参数会包含之前的状态,可以在这里恢复它。 - onStart():当Activity变得可见时调用。
- onResume():当Activity可见且位于前台、开始与用户交互时调用。此时Activity处于运行状态。
3. 当目标Activity需要返回数据给源Activity时
- setResult(int resultCode, Intent data):在目标Activity中,使用此方法设置要返回给源Activity的数据和结果码。
resultCode
是一个整数值,用于标识操作的结果(如Activity.RESULT_OK
或Activity.RESULT_CANCELED
),data
是一个Intent对象,用于携带返回给源Activity的数据。 - finish():在目标Activity中调用此方法以结束当前Activity,并将控制权返回给源Activity。如果源Activity是通过
startActivityForResult()
启动目标Activity的,则源Activity的onActivityResult(int requestCode, int resultCode, Intent data)
方法将被调用,以接收从目标Activity返回的数据和结果码。
4. 源Activity接收返回数据
- onActivityResult(int requestCode, int resultCode, Intent data):在源Activity中重写此方法以接收从目标Activity返回的数据和结果码。
requestCode
用于识别是哪个请求返回了结果,resultCode
是目标Activity通过setResult()
方法设置的结果码,data
是包含返回数据的Intent对象。
需要注意的是,上述方法中的某些(如onSaveInstanceState
)在正常情况下可能不会在简单的Activity跳转过程中被直接调用,除非涉及到Activity的重新创建(如屏幕方向变化或配置更改)。然而,在理解Activity之间跳转的过程中,了解这些方法的存在和它们的作用是很重要的。
4. 如何处理可能被系统回收的后台Activity?
处理可能被系统回收的后台Activity,并确保在被系统回收之前保存当前状态,是Android开发中常见的需求。这主要通过Activity的生命周期方法和onSaveInstanceState(Bundle outState)
回调来实现。以下是一些关键步骤和最佳实践:
1. 理解Activity生命周期
首先,你需要深入理解Activity的生命周期,特别是与Activity被暂停、停止和销毁相关的回调方法。这些方法包括onPause()
、onStop()
和onDestroy()
。然而,需要注意的是,onDestroy()
方法并不总是会被调用,特别是在系统需要回收资源以释放内存时。
2. 使用onSaveInstanceState(Bundle outState)
保存状态
当Activity即将被销毁(由于配置更改或系统需要回收内存)时,系统会调用onSaveInstanceState(Bundle outState)
方法。这是保存Activity状态(如用户输入的数据、滚动位置等)的绝佳机会。你可以在这个方法中将需要保存的数据放入传入的Bundle
对象中。
@Override
protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);// 保存需要的数据outState.putString("key", "value");// 对于复杂的数据结构,可能需要使用序列化// outState.putSerializable("complexKey", complexObject);
}
3. 在onCreate(Bundle savedInstanceState)
或onRestoreInstanceState(Bundle savedInstanceState)
中恢复状态
当Activity重新创建时(无论是由于配置更改还是系统恢复它),系统会调用onCreate(Bundle savedInstanceState)
方法,并将之前保存的Bundle
对象作为参数传递。你可以在这个方法中检查savedInstanceState
是否为null
,如果不为null
,则从中恢复你的状态。
另外,你也可以选择覆盖onRestoreInstanceState(Bundle savedInstanceState)
方法,它会在onStart()
方法之后被调用,专门用于恢复之前保存的状态。但是,大多数情况下,在onCreate()
中恢复状态就足够了。
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (savedInstanceState != null) {// 恢复状态String value = savedInstanceState.getString("key");// 对于复杂的数据结构,进行反序列化// ComplexObject complexObject = (ComplexObject) savedInstanceState.getSerializable("complexKey");}
}
4. 处理配置更改
有时,Activity可能因为配置更改(如屏幕方向变化)而被销毁和重新创建。如果你不希望Activity因为这些更改而被销毁,可以在AndroidManifest.xml的<activity>
标签中设置android:configChanges
属性,并指定你想要处理的配置更改类型(如orientation|screenSize
)。然后,在Activity中覆盖onConfigurationChanged(Configuration newConfig)
方法来处理配置更改。
但是,请注意,滥用android:configChanges
可能会导致应用难以适应新的设备配置和Android版本。因此,建议仅在你确信需要避免Activity重新创建时才使用它。
5. 使用ViewModel和LiveData(对于更复杂的状态管理)
如果你的应用使用MVVM架构,并且需要更复杂的状态管理,那么使用ViewModel和LiveData可能是一个更好的选择。ViewModel在配置更改和Activity重新创建时保持存活,因此它可以用来存储和恢复数据,而无需担心Activity的生命周期。
综上所述,通过合理利用Activity的生命周期方法、onSaveInstanceState()
和onRestoreInstanceState()
回调,以及(可选地)ViewModel和LiveData,你可以有效地处理可能被系统回收的后台Activity,并在需要时恢复其状态。
相关文章:
Android笔试面试题AI答之Activity(2)
答案仅供参考,大部分为文心一言AI作答 目录 1. 请介绍一下Activity 生命周期?1. 完全生命周期2. 可见生命周期3. 前台生命周期4. 配置更改5. 特殊场景 2. 请介绍一下横竖屏切换时Activity的生命周期变化?1.默认行为(未设置androi…...
来自Transformers的双向编码器表示(BERT) 通俗解释
来自Transformers的双向编码器表示(BERT) 目录 1. 从上下文无关到上下文敏感2. 从特定于任务到不可知任务3. BERT:把两个最好的结合起来4. BERT的输入表示5. 掩蔽语言模型(Masked Language Modeling)6. 下一句预测&am…...
代码随想录第十六天|贪心算法(2)
目录 LeetCode 134. 加油站 LeetCode 135. 分发糖果 LeetCode 860. 柠檬水找零 LeetCode 406. 根据身高重建队列 LeetCode 452. 用最少数量的箭引爆气球 LeetCode 435. 无重叠区间 LeetCode 763. 划分字母区间 LeetCode 56. 合并区间 LeetCode 738. 单调递增的数字 总…...

花几千上万学习Java,真没必要!(二十二)
1、final关键字: 测试代码1: package finaltest.com;public class FinalBasicDemo {public static void main(String[] args) {// final修饰基本数据类型变量final int number 5;// 尝试修改number的值,这将导致编译错误// number 10; // …...

在RK3568上如何烧录MAC?
这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址:https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码:hm30 烧录过程: 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录,双击运行RKDevInfo…...

1.30、基于卷积神经网络的手写数字旋转角度预测(matlab)
1、卷积神经网络的手写数字旋转角度预测原理及流程 基于卷积神经网络的手写数字旋转角度预测是一个常见的计算机视觉问题。在这种情况下,我们可以通过构建一个卷积神经网络(Convolutional Neural Network,CNN)来实现该任务。以下…...
Windows如何使用Python的sphinx
在Windows上使用Python的Sphinx进行文档渲染和呈现,可以遵循以下步骤进行操作: 安装Python:首先,确保你的Windows系统上已经安装了Python。你可以从Python的官方网站下载并安装适合你系统(32位或64位&…...
C++ STL nth_element 用法
一:功能 将一个序列分为两组,前一组元素都小于*nth,后一组元素都大于*nth, 并且确保第 nth 个位置就是排序之后所处的位置。即该位置的元素是该序列中第nth小的数。 二:用法 #include <vector> #include <a…...

【PostgreSQL教程】PostgreSQL 选择数据库
博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...
C# —— HashTable
集合collections命名空间,专门进行一系列的数据存储和检索的类,主要包含了:堆栈、和队列、list、ArrayList、数组 HashTable 字典 storeList 排序列表等类 Array 数组 长度固定, 类型固定 通过索引值来进行访问 ArrayList动态数组,…...
LeetCode 第407场周赛个人题解
目录 100372. 使两个整数相等的位更改次数 原题链接 思路分析 AC代码 100335. 字符串元音游戏 原题链接 思路分析 AC代码 100360. 将 1 移动到末尾的最大操作次数 原题链接 思路分析 AC代码 100329. 使数组等于目标数组所需的最少操作次数 原题链接 思路分析 A…...

使用Django框架实现音频上传功能
数据库设计(models.py) class Music(models.Model):""" 音乐 """name models.CharField(verbose_name"音乐名字", max_length32)singer models.CharField(verbose_name"歌手", max_length32)# 本质…...

[路由器]IP-MAC的绑定与取消
背景:当公司的网络不想与外部人员进行共享,可以在路由器页面配置IP-MAC的绑定,让公司内部人员的手机和电脑的mac,才能接入到公司。第一步:在ARP防护中,启动IP-MAC绑定选项,必须启动仅允许IP-MAC…...

Idea配置远程开发
Idea配置远程开发 本篇博客介绍使用idea通过ssh连接ubuntu服务器进行开发 目录 Idea配置远程开发1.idae上点击file->Remote Development2.点击New Connection3.填写相关信息4.输入密码5.选择IDE版本和项目路径5.1 点击open an SSH terminal打开控制台5.2 依次执行命令 6.成…...
lua 实现 函数 判断两个时间戳是否在同一天
函数用于判断两个时间戳是否在同一天。下面是对代码的详细解释: ### 函数参数 - stampA 和 stampB:两个时间戳,用于比较。- resetInfo:一个可选参数,包含小时、分钟和秒数,用于调整时间戳。 ### 函数实现…...
工作纪实53-log4j日志打印文件隔离
在项目中,我有一堆业务日志需要打印,另一部分的日志,是没有格式的,需要被云平台离线解析并收集到kafka或者hdfs、hive等,需要将日志隔离打印到不同的文件 正常的log4j配置是下面这样的,配合Sl4j直接使用默认…...

7月21日,贪心练习
大家好呀,今天带来一些贪心算法的应用解题、 一,柠檬水找零 . - 力扣(LeetCode) 解析: 本题的贪心体现在对于20美元的处理上,我们总是优先把功能较少的10元作为找零,这样可以让5元用处更大 …...

FPGA DNA 获取 DNA_PORT
FPGA DNA DNA 是 FPGA 芯片的唯一标识, FPGA 都有一个独特的 ID ,也就是 Device DNA ,这个 ID 相当于我们的身份证,在 FPGA 芯片生产的时候就已经固定在芯片的 eFuse 寄存器中,具有不可修改的属性。在 xilinx 7series…...
使用 hutool工具实现导入导出功能。
hutool工具网址 Hutool参考文档 pom依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.20</version></dependency><dependency><groupId>org.apache.poi</gro…...

大语言模型-Transformer-Attention Is All You Need
一、背景信息: Transformer是一种由谷歌在2017年提出的深度学习模型。 主要用于自然语言处理(NLP)任务,特别是序列到序列(Sequence-to-Sequence)的学习问题,如机器翻译、文本生成等。Transfor…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...