Android面试题汇总-Jetpack组件

一、Navigation

当然可以。Android Navigation组件是一个用于在Android应用中管理导航的框架,它简化了Fragment之间的交互和数据传递。

(1)Navigation组件的核心概念

  • NavHostFragment: 作为容器,承载应用中的目的地(Destination)页面,即Fragment。
  • NavController: 控制器,负责应用内的导航逻辑,如页面跳转、参数传递等。
  • NavGraph: 导航图,定义了所有导航目的地和它们之间的关系。
  • NavDestination: 目的地,代表应用中的一个页面,通常是Fragment。
  • Navigator: 抽象类,定义了不同类型的导航行为,如FragmentNavigator、ActivityNavigator等。

(2)Navigation的工作流程

  1. 创建导航图 (NavGraph):
    • res 目录下创建一个 navigation 资源目录。
    • 导航图的根标签是 <navigation>,其中 startDestination 属性指定了默认显示的界面。
    • 每个 <fragment> 标签代表一个Fragment类。
    • 每个 <action> 标签代表导航操作,包括目的地、切换动画等信息。
  2. 添加NavHostFragment:
    • 在Activity的布局中添加 <fragment> 标签,android:name 属性指定为 NavHostFragment
    • app:navGraph 属性链接到前面创建的导航图资源文件。
  3. 开始导航:
    • 使用 Navigation.findNavController(View) 方法找到 NavController
    • 调用 navigate() 方法执行导航操作,可以传递参数。

(3)参数传递和页面跳转

  • 页面间的跳转通过 < action > 实现,支持两种参数传递方式:
    • Bundle方式: 传统的Bundle传递参数。
    • 安全参数 (SafeArgs): 使用插件生成的类和方法传递参数,提高类型安全性。

(4)动画

  • <action> 中配置动画,包括进场和退场动画。

(5)导航堆栈管理

  • Navigation维护自己的任务栈,支持多种出栈操作:
    • 系统返回键: 默认出栈操作,回退到上一个导航页面。
    • popBackStack() 或 navigateUp(): 返回到上一个页面。
    • popUpTo 和 popUpToInclusive: 设置跳转时出栈的行为,可以清理任务栈中的页面。

(6)DeepLink

  • 支持通过 PendingIntent 或 URL链接直接定位到应用程序的某个destination。

(7)源码理解

  • NavHostFragmentNavController 是Navigation组件的核心,负责解析导航图和管理导航堆栈。
  • NavInflater 负责解析导航资源文件,生成 NavGraph
  • NavigatorProvider 存放所有 Navigator 的实例,负责具体的导航行为。

(8)自定义Navigator

  • 可以自定义Navigator,例如自定义FragmentNavigator以解决Fragment重复创建的问题。

二、DataBinding

DataBinding是Android的一个库,它允许你绑定UI组件在布局文件中到数据源,这样可以更简单地编写代码来更新UI元素。

DataBinding的原理

  1. APT预编译: 在编译时期,通过注解处理器(APT)生成绑定类,如ActivityMainBindingActivityMainBindingImpl

  2. 布局文件处理:

    处理布局时,生成两个XML文件:

    • activity_main-layout.xml:包含DataBinding所需的布局控件信息。
    • activity_main.xml:用于Android操作系统渲染的布局文件。

Model如何刷新View

  1. DataBindingUtil.setContentView: 此方法将XML中的各个View赋值给ViewDataBinding,完成findViewById的任务。
  2. ViewModel层的notifyPropertyChanged: 当ViewModel层调用此方法时,ViewDataBindingImplexecuteBindings方法中处理逻辑,从而更新UI。

View如何刷新Model

  • 双向绑定: ViewDataBindingImplexecuteBindings方法中为设置了双向绑定的控件添加监听器,如在EditText上设置TextWatcher
  • 监听器回调: 当数据发生变化时,TextWatcheronTextChanged()方法会通过回调更新Model。

DataBinding的使用

  • 布局文件中的绑定: 在布局文件中,可以使用<data>标签来定义绑定的数据,并通过<variable>标签来指定数据类型和变量名。
  • 表达式语言: DataBinding支持表达式语言,允许在布局文件中直接写入逻辑代码,如条件语句、方法调用等。
  • 资源引用: 可以在布局中直接引用资源文件,如字符串、颜色等。
  • 事件绑定: 可以将事件处理器直接绑定到布局中的UI组件上。

DataBinding的优势

  • 减少样板代码: 自动化的findViewById减少了初始化UI组件的代码。
  • 提高性能: 相比传统的UI更新方式,DataBinding可以更高效地处理数据变化和UI更新。
  • 类型安全: 编译时的类型检查减少了运行时错误。
  • 维护性: 使得代码更加模块化,易于维护和测试。

DataBinding是MVVM架构中的关键组件,它通过声明性布局和绑定机制,提高了开发效率和应用性能。

三、ViewModel

(1)ViewModel的作用

  • 数据存储和管理: ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。
  • 生命周期意识: 它能够在配置更改(如屏幕旋转)时保留数据,避免重新创建Activity时丢失数据。

(2)ViewModel的创建和使用

  • 创建: 通过ViewModelProvider获取ViewModel实例,例如:viewmodel = ViewModelProvider(this).get(MyViewModel::class.java)
  • 数据共享: ViewModel可以在UI组件(如Activity与Fragment)间实现数据共享。

(3)ViewModel的生命周期

  • ViewModel的生命周期通常比其所关联的Activity或Fragment更长。当Activity因为配置更改而被销毁并重新创建时,ViewModel仍然存在,因此可以继续使用之前保存的数据。

(4)ViewModel的内部工作原理

  • ViewModelStore: 一个存储ViewModel实例的容器,使用HashMap来管理这些实例。
  • Factory接口: ViewModelProvider的一个内部接口,用于构建ViewModel实例。

(5)ViewModel的优势

  • 数据持久化: ViewModel可以在Activity的整个生命周期内多次调用onCreate()方法时持久保存UI数据。
  • 避免内存泄漏: 引入ViewModel和LiveData后,可以实现ViewModel和View的解耦,避免内存泄漏和空指针异常。

(6)ViewModel的最佳实践

  • 不持有View引用: ViewModel不应该持有View的引用,以避免内存泄漏。
  • 使用LiveData: 结合LiveData使用,可以使ViewModel响应数据变化,并更新UI。

ViewModel通过这些机制提供了一个强大的数据管理和UI状态保持的解决方案,使得Android应用的开发更加高效和稳定。

ViewModel 类是 Android 架构中的关键组件之一。它充当业务逻辑或屏幕级别状态的持有者。其主要目的是将状态暴露给 UI,并封装相关的业务逻辑。其中一个关键优势是它缓存状态并在配置更改(例如屏幕旋转)时持久化状态。这意味着在不同 Activity 之间导航或处理配置更改时,UI 不需要重新获取数据。

(1)为什么使用 ViewModel?

  1. UI 状态持久化:ViewModel 允许您持久化 UI 状态。它确保数据在配置更改期间仍然可用。
  2. 访问业务逻辑:ViewModel 提供了方便的 API,用于数据持久化和访问业务逻辑。

(2)如何创建 ViewModel?

  1. 使用 ViewModelProviders.of():您可以使用以下代码创建 ViewModel:
MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
  1. 在 Activity 或 Fragment 中提供 ViewModelStore:每个 Activity 或 Fragment 都有一个 ViewModelStore 对象,用于保存该页面的 ViewModel 对象。

(3)为什么使用 ViewModel?

  1. 管理 UI 界面数据:ViewModel 可以帮助您管理 UI 界面的数据。它将加载数据与数据恢复从 Activity 或 Fragment 中解耦

  2. 数据持久化:在 Android 系统中,需要数据恢复有两种场景

    • 场景1:资源相关的配置发生改变导致 Activity 被杀死并重新创建
    • 场景2:资源内存不足导致低优先级的 Activity 被杀死
    • 使用 onSaveInstanceStateonRestoreInstanceState 可以处理部分数据的保存和恢复,但它只适合保存少量可以被序列化、反序列化的数据。
    • 官方最终采用了 onRetainNonConfigurationInstance 的方式来恢复 ViewModel。在屏幕旋转时,通过 Binder 回调 Activity 的 retainNonConfigurationInstances() 方法,数据保存在 NonConfigurationInstances 对象中。再次使用时,从该对象中取出 ViewModelStore 对象,其中保存了 ViewModel 集合。官方重写了 onRetainNonConfigurationInstance 方法,在该方法中保存了 ViewModelStore
  3. Fragments 间共享数据:通过获取 Activity 的 ViewModelStore 对象,实现了 Fragment 之间的 ViewModel 共享。不同的 Fragment 可以共享同一份 ViewModel。因此,不同的 Fragment 可以使用相同的 Activity 对象来获取 ViewModel。

四、LiveData

什么是 LiveData

LiveData 是一个可被观察的数据容器类。它将数据包装起来,使得数据成为“被观察者”,而页面成为“观察者”。这样,当数据发生变化时,页面能够获得通知,进而更新 UI。

如何使用 LiveData

在页面中,我们可以通过 LiveData.observe() 方法对 LiveData 包装的数据进行观察。当我们想要修改 LiveData 包装的数据时,可以使用 LiveData.postValue()LiveData.setValue()postValue() 在非 UI 线程中使用,而在 UI 线程中使用 setValue() 方法。

为什么使用 LiveData?

  1. 避免内存泄漏:观察者会绑定到 Lifecycle 对象,并在其关联的生命周期销毁后进行自我清理。
  2. 自动处理生命周期:如果观察者的生命周期处于非活跃状态(例如返回栈中的 Activity),则它不会接收任何 LiveData 事件

五、Lifecycle

在Android开发中,Lifecycle是Jetpack组件库中的一个重要组件,它允许开发者以声明式方式管理应用组件(如Activity和Fragment)的生命周期。这样可以避免内存泄漏和其他常见的问题。

Lifecycle的概念与作用

Lifecycle是一个生命周期感知型组件,它能够响应另一个组件(如Activity和Fragment)的生命周期状态的变化。其核心功能是将组件的生命周期状态通知给观察者(LifecycleObserver),观察者根据这些状态变化来执行相应的操作。例如,在Activity或Fragment销毁时释放资源,在Activity或Fragment处于活跃状态时更新数据,在Activity或Fragment处于暂停状态时暂停某些操作。

Lifecycle的三大核心类

  • LifecycleOwner: 是一个接口,表示具有生命周期的组件。Activity和Fragment都实现了这个接口。开发者可以通过实现这个接口来监听组件的生命周期变化。
  • LifecycleRegistry: 是一个类,负责管理LifecycleOwner的生命周期状态,并将这些状态通知给已注册的观察者。
  • LifecycleObserver: 是一个空方法接口,用于标识观察者,对Lifecycle对象进行监听。

Lifecycle的使用步骤

  1. 实现LifecycleOwner: 重写getLifecycle方法,返回一个LifecycleRegistry实例。这个实例在不同的生命周期事件中通过markState方法来标记状态。
class MyActivity : AppCompatActivity(), LifecycleOwner {private val mLifecycleRegistry = LifecycleRegistry(this)override fun getLifecycle(): Lifecycle {return mLifecycleRegistry}
}
  1. 继承LifecycleObserver: 创建一个类继承LifecycleObserver,并实现需要响应的生命周期事件方法。
class MyObserver : LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)fun onResumed(owner: LifecycleOwner) {// 你的代码逻辑}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)fun onPaused(owner: LifecycleOwner) {// 你的代码逻辑}
}
  1. 注册LifecycleObserver: 在LifecycleOwner中,使用getLifecycle().addObserver()方法注册LifecycleObserver
class MyActivity : AppCompatActivity() {private val myObserver = MyObserver()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)lifecycle.addObserver(myObserver)}
}

通过以上步骤,你就可以使用Lifecycle来管理你的应用组件的生命周期了。这样做可以让你的代码更加简洁,逻辑更清晰,同时也能提高应用的性能和稳定性。

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

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

相关文章

赶紧收藏!2024 年最常见 20道分布式、微服务面试题(四)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道分布式、微服务面试题&#xff08;三&#xff09;-CSDN博客 七、请解释服务发现和服务注册的概念。 服务发现&#xff08;Service Discovery&#xff09;和服务注册&#xff08;Service Registration&#xff0…

C++ 11 【线程库】【包装器】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C修炼之路⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言 一、thread类的简单介绍 get_id…

BeagleBone Black入门总结

文章目录 参考连接重要路径系统镜像下载访问 BeagleBone 参考连接 镜像下载启动系统制作&#xff1a;SD卡烧录工具入门书籍推荐&#xff1a;BeagleBone cookbookBeagleBone概况&#xff1f; 重要路径 官方例程及脚本路径&#xff1a;/var/lib/cloud9 系统镜像下载 疑问&am…

C 语言实现在终端里输出二维码

Mac 环境安装二维码库 brew install qrencode安装过程报权限问题执行以下命令 sudo chown -R 用户名 /usr/local/include /usr/local/lib chmod uw /usr/local/include /usr/local/lib#include <stdio.h> #include <qrencode.h>void print_qr_code(QRcode *qrcode…

SpringBoot+Vue图书管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户管理员 功能截图

人工智能在交通与物流领域的普及及应用

文章目录 &#x1f40b;引言 &#x1f40b;自动驾驶 &#x1f988;自动驾驶汽车 &#x1f421;应用现状 &#x1f421;技术实现 &#x1f421;实现过程及代码 &#x1f40b;智能交通管理 &#x1f988;应用现状 &#x1f988;技术实现 &#x1f988;实现过程及代码 &…

嵌入式基础知识

ARM 内核版本号 架构&#xff1a;如ARMv7&#xff0c;是ARM公司确定的&#xff0c;ARMv7是32位(见到的芯片多是该架构)&#xff0c;ARMv8是64位但也支持32位。该架构定义了处理器的基本指令集、体系结构以及支持的技术特性。 ARM SoC版本号 内核&#xff1a;如Cortex-A8&…

老黄一举揭秘三代GPU!打破摩尔定律,打造AI帝国,量产Blackwell解决ChatGPT全球耗电难题

近日&#xff0c;老黄手持Blackwell向全世界展示的那一刻&#xff0c;全场观众沸腾了。 这是迄今为止世界上最大的芯片&#xff01; 用老黄的话来说&#xff0c;它是「全世界迄今为止制造出来的最复杂、性能最高的计算机。」GPT-4o深夜发布&#xff01;Plus免费可用&#xff01…

结构体(1)<C语言>

导言 结构体是C语言中的一种自定义类型&#xff0c;它的值&#xff08;成员变量&#xff09;可以是多个&#xff0c;且这些值可以为不同类型&#xff0c;这也是和数组的主要区别&#xff0c;下面将介绍它的一些基本用法&#xff0c;包括&#xff1a;结构体的创建、结构体变量的…

【Vue】Vue路由-重定向

问题 网页打开时&#xff0c; url 默认是 / 路径&#xff0c;未匹配到组件时&#xff0c;会出现空白 解决方案 重定向 → 匹配 / 后, 强制跳转 /home 路径 语法 { path: 匹配路径, redirect: 重定向到的路径 }, 比如&#xff1a; { path:/ ,redirect:/home }代码示例 const…

在量子计算时代,大数据技术将面临哪些挑战和机遇?

在量子计算时代&#xff0c;大数据技术将面临以下挑战和机遇&#xff1a; 挑战&#xff1a; 处理速度&#xff1a;量子计算机具有极高的计算速度&#xff0c;大数据技术需要适应和充分利用这种速度。现有的大数据算法和架构可能需要重新设计和优化&#xff0c;以充分发挥量子计…

应用广义线性模型二|二响应广义线性模型

系列文章目录 文章目录 系列文章目录一、二响应模型的不同表达方式和响应函数二、二响应模型的性质&#xff08;一&#xff09;二响应变量的条件数学期望与方差&#xff08;二&#xff09;二响应模型参数的极大似然估计&#xff08;三&#xff09;二响应模型的优势 三、二响应模…

如何在Windows 11中恢复丢失的快速访问菜单?这里提供解决办法

序言 在电脑的“快速访问”菜单中找不到固定的项目?或者,整个菜单对你来说已经消失了吗?无论哪种方式,你都可以强制你的电脑恢复菜单并显示其中的所有项目。以下是如何在你的Windows 11电脑上做到这一点。 将文件资源管理器设置为打开到主页 当你在文件资源管理器的左侧…

分享飞行棋夫妻互动游戏高阶版,揭秘夫妻飞行棋游戏玩法!

朋友们&#xff0c;今天我要给你们介绍一款超级甜蜜的小游戏——情侣飞行棋。别小看它&#xff0c;这可不是咱们小时候玩的那种&#xff0c;这是专门为咱们这些恩爱的小两口设计的&#xff0c;能让你们的感情在游戏中更加甜蜜蜜&#xff0c;擦出更多爱的火花。 准备好了吗&…

力扣96 不同的二叉搜索树 Java版本

文章目录 题目描述代码 题目描述 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 示例 2&#xff1a; 输入…

鸿蒙低代码开发一个高频问题

在版本是DevEco Studio 3.1.1 Release&#xff0c;SDK是3.1.0(API9)。 创建和设计的visual文件经常会遇到无法渲染的情况&#xff0c;或者自定义组件在Custom列表中突然不见了的情况。 有以下报错信息的&#xff1a; JSON schema validation error: data/visualModel/value/…

强化学习面试题

强化学习面试题通常会涵盖该领域的多个方面,包括基本概念、算法、应用以及实践问题。以下是一些常见的强化学习面试题及其简要回答: 基本概念题: 什么是强化学习? 强化学习是一种通过智能体与环境交互来学习最优行为策略的机器学习范式。智能体根据当前状态选择动作,环境…

React Native 快速Demo(2)

好的&#xff0c;以下是开发环境的详细设置步骤&#xff0c;包括需要安装的工具和每个工具的安装步骤。 1. Node.js 和 npm Node.js 是一个 JavaScript 运行时环境&#xff0c;npm 是 Node.js 的包管理器。 1.1 安装 Node.js 和 npm 下载 Node.js 安装程序&#xff1a;Node…

小程序for循环中的key值有什么用

在小程序&#xff08;特别是微信小程序&#xff09;中&#xff0c;当使用类似于 wx:for 的指令来渲染一个列表时&#xff0c;key 属性&#xff08;或称为 wx:key&#xff09;是一个非常重要的属性。这个属性用于指定列表中项目的唯一的标识符&#xff0c;以帮助小程序优化渲染性…

springboot + Vue前后端项目(第十五记)

项目实战第十五记 写在前面1.后端接口实现1.1 用户表添加角色字段1.2 角色表增加唯一标识字段1.3 UserDTO1.4 UserServiceImpl1.5 MenuServiceImpl 2. 前端实现2.1 User.vue2.2 动态菜单设计2.2.1 Login.vue2.2.2 Aside.vue 2.3 动态路由设计2.3.1 菜单表新增字段page_path2.3.…