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…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...