国外大厂面试题, 7 个 Android Lifecycle 重要的知识点_android lifecyclescope

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

private val viewMode:MainViewModel by viewModels()

}


* `by viewModels ()` 会在重新启动或从已杀死的进程中恢复时,实例化一个新的 `ViewModel`。如果有配置更改,例如设备被旋转时,它将检查 `ViewModel` 是否已经创建,而不重新创建它


![](https://img-blog.csdnimg.cn/img_convert/3d50a1fe0f7e0d915d9d8c481205cf6e.png)


* `ViewModels()` 会根据需要自动注入 `SavedInstancestate` (例如 Activity 中的 `SavedInstanceState` 和 `Intent`),如果我们有其他依赖是通过 `Dagger Hilt` 注入,它将与 `ViewModel` 一起使用下面的参数



@HiltViewModel
class MyViewModel @Inject constructor(
private val repository: Repository,
savedStateHandle: SavedStateHandle
) : ViewModel {

}


#### 面试题四:ViewModel as StateRestoration Solution


**问题:**


Jetpack 架构组件提供的 `ViewModel` 的作用是什么?



class MainActivity: AppCompatActivity() {
private val viewMode:MainViewModel by viewModels()
// Some other Activity Code
}


**错误回答**


`ViewModel` 是用于状态恢复,例如当 `Activity` 被杀死并重新启动时,`ViewModel` 是用来帮助恢复到原始状态。


**正确回答**


`ViewModel` 实际上是 google 提供的 Jetpack 架构组件之一,它鼓励 Android 开发者使用 MVVM 设计模式。


它还有其它重要的功能,例如设备旋转时,即使 `Activity` 和 `Fragment` 被销毁,它们各自的 `ViewModel` 仍会保留,Google 在 `ViewModel` 中提供了一个名为 `savedStateHandle` 参数,该参数用于保存和恢复数据。


#### 面试题五:LiveData as State Restoration Solution


**问题:**


Jetpack 架构组件提供的 `LiveData` 的作用是什么。



// Declaring it
val liveDataA = MutableLiveData()
// Trigger the value change
liveDataA.value = someValue


**错误回答:**


它的存在是为了确保数据在 Activity 的生命周期中存活。当 Activity 在进程销毁返回时,数据将会自动恢复。


**正确回答**


`LiveData` 本身不能在进程销毁中存活。它是一种特殊类型的数据,根据观察者(Activity 或 Fragment)的生命周期来控制其发出的值。


![](https://img-blog.csdnimg.cn/img_convert/c517b55d0f72bb131ada6d8c522552b5.png)


`ViewModel` 在配置变更后仍然存在,所以 `ViewModel` 内部的 `LiveData` 也一样。这确保 `LiveData` 发射值按照下图控制。


![](https://img-blog.csdnimg.cn/img_convert/7382918a1f3775b0811e445e73943eda.png)


然而 `LiveData` 本身不能在进程销毁中存活,当内存不足时,Activity 被系统杀死,`ViewModel` 本身也会被销毁。


为了解决这个问题,Google 在 `ViewModel` 中提供了一个名为 `savedStateHandle` 参数,该参数用于保存和恢复数据,以便数据在进程销毁后继续存在。



@HiltViewModel
class MyViewModel @Inject constructor(
private val repository: Repository,
savedStateHandle: SavedStateHandle
) : ViewModel {
// Some other ViewModel Code
}


它是一种增强的机制,可以处理 `Intent` 和 `SavedInstanceState`,在以前的时候,这些都是由 `Activity` 单独处理的。


![](https://img-blog.csdnimg.cn/img_convert/f17335a0f0e774d4c32c438f0626d0e0.png)


为了确保 `Livedata` 保存下来,我们可以在 `SavedStateHandle` 中检查 `Livedata` 是否已经创建。



val liveData = savedStateHandle.getLiveData(KEY)


类似地,这也适用于 `stateFlow`,它可以在进程销毁中存活下来。



val stateFlow = savedStateHandle.getStateFlow(KEY, 0)


因此 `LiveData` 本身并不是用来恢复数据的。


#### 面试题六:When is The View Destroyed But Not the Instance


**问题:**


在 Activity 或 Fragment 通常会有一个视图。你能给我提供一个场景,实例的视图被破坏了,但实例(例如 Activity 或 Fragment)还存在。


**错误回答**


1. 当配置发生变化时(例如设备旋转)
2. 当内存不足时,App 在后台运行,进程会杀死 App


**正确回答**


实际上 `Activity` 总是与其视图一起被销毁。因此,在 Activity 中没有 `onDestroyView ()` 生命周期方法。


只有在 `Fragment` 中有 `onDestroyView ()` 生命周期方法。在大多数情况下 `Fragment` 和它的视图一起被销毁。


但是通过 `Fragment transaction` 用一个 `Fragment` 替换另一个 `Fragment` 时,栈下面的 `Fragment` 仍然存在,但是它的视图被破坏了。


![](https://img-blog.csdnimg.cn/img_convert/c6e0b659c441fbcec17bb0f06bfe1197.png)


当一个 `Fragment` 被另一个 `Fragment` 替换时,会调用 **onDestroyView ()** 方法,但不会调用 **onDestroy ()** 或 **onDetect ()** 方法。


正因为这种复杂性,在使用 `Fragment` 时,会遇到许多奇怪的问题。和 `Fragment` 相关的问题,将会在后面的文章中分享。


#### 问题七:Lifecycle Aware Coroutine


在 App 中使用协程,如何确保它们的生命周期可感知。


**错误回答**


1. 对于普通视图,只需在 `Activity` 或 `Fragment` 中使用 `lifecycleScope`,在 `ViewModel` 中使用 `viewModelScope`
2. 对于组合视图,需要使用 `stateFlow` 中的 `collectAsState()` 方法,因为当可组合函数不活动时,它不会收集


**正确回答**


对于普通视图,即使 `lifecycleScope` 是可用的,它在 `Activity` 或 `Fragment` 的整个生命周期中都处于活动状态。因为有时我们希望某些场景只在 `onStart()` 或 `onResume()` 之后处于活动状态。


为此,我们需要在 `lifecycleScope` 中使用像 `repeatOnLifecycle` 这样的 API 提供额外的作用域。



lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.stateFlowValue.collect {
// Do something
}
}
}


它们的变体如下图所示。


![](https://img-blog.csdnimg.cn/img_convert/284282e0c06f2c52114adb4210a91a0b.png)


对于组合视图 `collectAsState()` 不会确保在组合函数处于活动状态时安全使用数据,它也不会停止继续发送 `StateFlow`,这会导致资源浪费。


为了确保只在 `Activity` 或 `Fragment` 处于正确的生命周期时,例如在 `onStart ()` 之后发出,我们需要使用 `collectAsStateWithLifecycle ()` 和 `stateFlow` 中的 `WhileSubscribed (...)`。


当我们在研究 `collectAsStateWithLifecycle()` 源码时,发现它也在使用 `repeatOnLifecycle(…)`。


![](https://img-blog.csdnimg.cn/img_convert/2d95d46541697e021c1c105f3b66ebe4.png)


**全文到这里就结束了,感谢你的阅读,坚持原创不易,欢迎在看、点赞、分享给身边的小伙伴,我会持续分享原创干货!!!**




---


我开了一个云同步编译工具(SyncKit),主要用于本地写代码,同步到远程设备,在远程设备上进行编译,最后将编译的结果同步到本地,代码已经上传到 Github,欢迎前往仓库 [hi-dhl/SyncKit]( ) 查看。


* [仓库 SyncKit:https://github.com/hi-dhl/SyncKit]( )
* [下载地址:https://github.com/hi-dhl/SyncKit/releases]( )




---


**最新文章**


* [Android 13这些权限废弃,你的应用受影响了吗?]( )
* [Android 12 已来,你的 App 崩溃了吗?]( )
* [Android 利器,我开发了云同步编译工具]( )
* [Twitter 上有趣的代码]( )
* [谁动了我的内存,揭秘 OOM 崩溃下降 90% 的秘密]( )
* [反射技巧让你的性能提升 N 倍]( )
* [90%人不懂的泛型局限性,泛型擦除,星投影]( )
* [揭秘反射真的很耗时吗,射 10 万次耗时多久]( )
* [Google 宣布废弃 LiveData.observe 方法]( )
* [影响性能的 Kotlin 代码(一)]( )
* [揭秘 Kotlin 中的 == 和 ===]( )


**开源新项目**


* 云同步编译工具(SyncKit),本地写代码,远程编译,欢迎前去查看 [SyncKit]( )
* KtKit 小巧而实用,用 Kotlin 语言编写的工具库,欢迎前去查看 [KtKit]( )
* 最全、最新的 AndroidX Jetpack 相关组件的实战项目以及相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看 [AndroidX-Jetpack-Practice]( )
* LeetCode / 剑指 offer,包含多种解题思路、时间复杂度、空间复杂度分析,[在线阅读]( )



> 
> 作者:程序员DHL  
>  链接:https://juejin.cn/post/7166053395366117407
> 
> 
> 


### 最后


如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。


如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/06e41b3932164f0db07014d54e6e5626.png)  


## 文末

那么对于想坚持程序员这行的真的就一点希望都没有吗?
其实不然,在互联网的大浪淘沙之下,留下的永远是最优秀的,我们考虑的不是哪个行业差哪个行业难,就逃避掉这些,无论哪个行业,都会有他的问题,但是无论哪个行业都会有站在最顶端的那群人。我们要做的就是努力提升自己,让自己站在最顶端,学历不够那就去读,知识不够那就去学。人之所以为人,不就是有解决问题的能力吗?挡住自己的由于只有自己。
**Android希望=技能+面试**

* **技能**
  ![](https://img-blog.csdnimg.cn/img_convert/696a44626110f8ef715099ee5280afdd.webp?x-oss-process=image/format,png)
* **面试技巧+面试题**
  ![](https://img-blog.csdnimg.cn/img_convert/d5eab1f71e0131485cb1d22482d0e0d3.webp?x-oss-process=image/format,png)



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)**
![img](https://img-blog.csdnimg.cn/img_convert/d3167819fccecae7f4af2f511165e865.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

0608163)]
* **面试技巧+面试题**
  [外链图片转存中...(img-cf6NV9XM-1713110608164)]



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)**
[外链图片转存中...(img-vIszWvR5-1713110608164)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值