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的生命周期变化如下:

  1. onPause():Activity即将失去焦点,但尚未完全停止。
  2. onSaveInstanceState(Bundle outState):在Activity即将被销毁之前调用,允许你保存Activity的当前状态。这个状态会在Activity重新创建时通过onCreate(Bundle savedInstanceState)onRestoreInstanceState(Bundle savedInstanceState)方法恢复。
  3. onStop():Activity不再可见。
  4. onDestroy():Activity正在被销毁。
  5. onCreate(Bundle savedInstanceState):Activity被重新创建。如果之前保存了状态,则savedInstanceState参数将包含之前的状态。
  6. onStart():Activity再次变得可见。
  7. 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_OKActivity.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,并在需要时恢复其状态。

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

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

相关文章

Cisco 路由重发布 —— 实现路由信息在不同路由域间的传递

一、技术背景 在实际的组网中&#xff0c;可能会遇到这样一个场景&#xff1a;在一个网络中同时存在两种或者两种以上的路由协议。例如客户的网络原先是纯 Cisco 的设备&#xff0c;使用 EIGRP 协议将网络的路由打通。但是后来网络扩容&#xff0c;增加了一批华为的设备&#…

【题解 Kruskal重构树 LCA】 星际导航

星际导航 分析&#xff1a; 这也是一个比较老的题目了 今天突然想学一下kruskal重构树&#xff0c;就做到了这个题。 首先我们要明白&#xff0c;为什么这道题的路径一定是在最小生成树里&#xff1f; 或许是我们惯有的经验&#xff1a;最小的最大或者最大的最小无非两种套路…

信号【Linux】

文章目录 信号处理方式&#xff08;信号递达&#xff09;前后台进程 终端按键产生信号kill系统调用接口向进程发信号阻塞信号sigset_tsigprocmasksigpending内核态与用户态&#xff1a;内核空间与用户空间内核如何实现信号的捕捉 1、信号就算没有产生&#xff0c;进程也必须识别…

题解:T480718 eating

eating 题目背景 从前有个荣光的王国&#xff0c;小 A 是里面的国王&#xff0c;今天他要赐予他的子民以仓廪。 题目描述 在一条街上有 n n n 个饭店。小 A 站在这条街的最左端。 第 i i i 个饭店离这条街最左端的距离是 a i a_i ai​&#xff0c;它所售卖的菜品的美味…

【C++】C++类和对象详解(上)

目录 思维导图大纲&#xff1a; 思维方面&#xff1a; 1. 类的定义&#xff1a; 2. 类的特点&#xff1a; 3. this指针&#xff1a; 4. 类的默认成员函数 默认构造函数 1.构造函数 2.析构函数 3.拷贝构造函数 4. 赋值运算符重载 1. 运算符重载 5. 日期类实现&#…

【CPP】CPP的内存管理

目录 10 C/C内存管理10.1 内存分布10.2 C的动态内存管理10.3 C的内存管理10.4 new失败的检测10.5 operator new与operator delete函数10.5 new与malloc()的区别,delete与free()的区别10.6 定位new表达式 这里是oldking呐呐,感谢阅读口牙!先赞后看,养成习惯! 个人主页:oldking呐…

编程中的智慧四:设计模式总览

前面三篇我们通过从一些零散的例子&#xff0c;和简单应用来模糊的感受了下设计模式在编程中的智慧&#xff0c;从现在开始正式进入设计模式介绍&#xff0c;本篇将从设计模式的7大原则、设计模式的三大类型、与23种设计模式的进行总结&#xff0c;和描述具体意义。 设计模式体…

怎样在 Nginx 中配置防盗链?

文章目录 怎样在 Nginx 中配置防盗链&#xff1f;一、什么是盗链&#xff1f;二、Nginx 防盗链的原理三、Nginx 防盗链的配置步骤四、防盗链配置的实际应用示例五、常见问题及解决方法六、总结 怎样在 Nginx 中配置防盗链&#xff1f; 在当今数字化的时代&#xff0c;网站内容…

使用Diffusion Models进行街景视频生成

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;街景图生成相当有挑战性&#xff0c;目前的文本到视频的方法仅限于生成有限范围的场景的短视频&#xff0c;文本到3D的方法可以生成单独的对象但不是整个城市。除此之外街景图对一致性的要求相当高&#x…

AOP面向切面编程的代码实现

目录 一.AOP简介&#xff1a; 二.AOP实现步骤&#xff1a; 1.在pom.xml中导入配置&#xff1a; 2.自定义注解 3.自定义切面类 4.在方法上加入自定义注解&#xff0c;来使用AOP 5.在启动类上加入EnableTransactionManagement注解 引言&#xff1a;本文快速带领读者了解AO…

webSocket模块组件

对应的头文件 #include <websocketpp/config/asio_no_tls.hpp> #include <websocketpp/server.hpp> #include <nlohmann/json.hpp> #include <boost/asio.hpp> #include <queue> #include <functional> #include <memory> #include…

数据库基础与安装MYSQL数据库

一、数据库管理系统DBMS 数据库技术是计算机科学的核心技术之一&#xff0c;具有完备的理论基础。使用数据库可以高效且条理分明地存储数据&#xff0c;使人们能够更加迅速、方便地管理数据 1.可以结构化存储大量的数据信息&#xff0c;方便用户进行有效的检索和访问 2.可以…

算法学习6——贪心算法

什么是贪心算法&#xff1f; 贪心算法是一种在每一步选择中都采取当前状态下最优或最有利的选择的算法。其核心思想是通过一系列局部最优选择来达到全局最优解。贪心算法广泛应用于各种优化问题&#xff0c;如最短路径、最小生成树、背包问题等。 贪心算法的特点 局部最优选…

目前航空航天设备怎么减重设计

目前航空航天设备怎么减重设计 1.使用轻质高强度材料1.1复合材料1.2金属基复合材料1.3陶瓷基复合材料1.4功能梯度材料和蜂窝材料 2.结构优化设计2.1拓扑优化2.2仿生学设计 3.部件和系统轻量化3.1机载娱乐系统3.2航空线缆3.3激光焊接技术 4.发动机和推进系统的优化4.1轻量化发动…

python爬虫Selenium模块及测试案例详解

什么是selenium&#xff1f; &#xff08;1&#xff09;Selenium是一个用于Web应用程序测试的工具。 &#xff08;2&#xff09;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 &#xff08;3&#xff09;支持通过各种driver&#xff08;FirfoxDrive…

Codeforces 923 div3 A-G

A 题目分析: 记录隔得最远的两个B的距离 C代码&#xff1a; #include<iostream> using namespace std; int main(){int t;cin>>t;while(t--){int n;cin>>n;string s;cin>>s;int a0,b0,cnt0;//a:第一个B的下标 b:最后一个B的下标for(int i0;i<s.s…

python gradio 的输出展示组件

HTML&#xff1a;展示HTML内容&#xff0c;适用于富文本或网页布局。JSON&#xff1a;以JSON格式展示数据&#xff0c;便于查看结构化数据。KeyValues&#xff1a;以键值对形式展示数据。Label&#xff1a;展示文本标签&#xff0c;适用于简单的文本输出。Markdown&#xff1a;…

JavaScript之WebAPIs-BOM

目录 BOM操作浏览器一、Window对象1.1 BOM&#xff08;浏览器对象模型&#xff09;1.2 定时器-延时函数1.3 js执行机制1.4 location对象1.5 navigator对象1.6 history对象 二、本地存储三、补充数组中的map方法数组中的join方法数组中的forEach方法(重点)数组中的filter方法(重…

Linux——Centos系统安装(动图演示)

一、创建虚拟机并做相应配置 打开VMware Workstation&#xff0c;选择创建新的虚拟机&#xff1b; 1、选择自定义选项&#xff1a;点击下一步 2、选择虚拟机硬件兼容性&#xff1a;直接下一步就行了&#xff1b;点击下一步 3、安装客户机操作系统&#xff1a;这里我们选择稍后安…

C++对象模型之绕过private权限修饰符

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、C对象模型二、演示1.类层次2.内存排列 总结 前言 咱们都知道C语言在创建类的时候data member&#xff08;数据成员&#xff09;和fuchtion member&#xf…