Android程序员想搞懂Jetpack架构可以不搞懂生命周期知识吗?

前言

Activity生命周期真是一个非常古老的话题,无论是10年前,还是当下。不管是面试还是工作,经常会遇到与Activity生命周期相关的问题。比如“按下返回键和Home键,生命周期方法调用顺序”、“A启动B,它们的生命周期方法调用顺序”。工作中,Jetpack Lifecycle、LiveData、ViewModel等组件都是建立在生命周期之上。

在我研究Jetpack Lifecycle、LiveData、ViewModel源码时,我发现它们与组件的生命周期有很大的关系。它们能够自动感知组件的生命周期变化。LiveData能够在onDestroy方法调用时自动将监听注销掉,ViewModel能够在Configuration发生改变时(比如旋转屏幕)自动保存数据,并且在Activity重建时恢复到Configuration发生改变之前。

本文我将从几个场景详细介绍Activity的生命周期变化。

2. 单Activity按返回按钮

触发步骤:

  • 按返回按钮
  • 或者调用finish方法
  • 重新进入Activity

该场景演示了用户启动,销毁,重新进入Activity的生命周期变化。调用顺序如图:

状态管理:

  • onSaveInstanceState没有被调用,因为Activity被销毁,没有必要保存状态
  • 当Activity被重新进入时,onCreate方法bundle参数为null

3. 单Activity按Home键

触发步骤:

  • 用户按Home键
  • 或者切换至其它APP
  • 重新进入Activity

该场景Activity会调用onStop方法,但是不会立即调用onDestroy方法。调用顺序如图:

状态管理:

当Activity进入Stopped状态,系统使用onSaveInstanceState保存app状态,以防系统将app进程杀死,重启后恢复状态。

4. 单Activity旋转屏幕

触发步骤:

  • Configuration发生改变, 比如旋转屏幕
  • 用户在多窗口模式下调整窗口大小

当用户旋转屏幕,系统会保留旋转之前的状态,能很好的恢复到之前的状态。调用顺序如图:

状态管理:

  • Activity被完全销毁掉,但是状态会被保存,而且会在新的Activity中恢复该状态
  • onCreate和onRestoreInstanceState方法中的bundle是一样的

5. 单Activity弹出Dialog

触发步骤:

  • 在API 24+上开启多窗口模式失去焦点时
  • 其它应用部分遮盖当前APP,比如弹出权限授权dialog
  • 弹出intent选择器时,比如弹出系统的分享dialog

该场景不适用于以下情况:

  • 相同APP中弹dialog,比如弹出AlertDialog或者DialogFragment不会导致Activity onPause发生调用
  • 系统通知。当用户下拉系统通知栏时,不会导致下面的Activity onPause发生调用。

6. 多个Activity跳转

触发步骤:

  • activity1 跳转到activity2
  • 按返回按钮

注意:activity1 跳转到activity2 正确的调用顺序是

->activity1.onPause

->activity2.onCreate

->activity2.onStart

->activity2.onResume

->activity1.onStop

->activity1.onSaveInstanceState

在该场景下,当新的activity启动时,activity1处于STOPPED状态下(但是没有被销毁),这与用户按Home键有点类似。当用户按返回按钮时,activity2被销毁掉。

状态管理:

  • onSaveInstanceState会被调用,但是onRestoreInstanceState不会。当activity2展示在前台时,如果发生了旋转屏幕,当activity1再次获得焦点时,它将会被销毁并且重建,这就是为什么activity1在失去焦点时为什么需要保存状态。
  • 如果系统杀死了app进程,该场景后面会介绍到

7. 多个Activity跳转,并且旋转屏幕

  • activity1 跳转到activity2
  • 在activity2上旋转屏幕
  • 按返回按钮

注意: 当返回activity1时,必须保证屏幕是保持旋转后的状态,否则并不会调用onDestroy方法。而且是在activity1回到前台时才会主动掉onDestroy

状态管理:

保存状态对所有的activity都非常重要,不仅仅是对前台activity。所有在后台栈中的activity在configuration发生改变时重建UI时都需要将保存的状态恢复回来。

8. 多个Activity跳转,被系统kill掉app

  • activity1 跳转到activity2
  • 在activity2上按Home键
  • 系统资源不足kill app

9. 总结

本文主要是从Google大佬Jose Alcérreca的文章翻译过来。他假设的这7个关于activity的生命周期场景,对了解Lifecycle有非常大的帮助。甚至对于面试都是有非常大的帮助。

后续我会写一系列关于Jetpack的文章。文风将会延续我的一贯风格,深入浅出,坚持走高质量创作路线。本文是我讲解Lifecycle的开篇之作。生命周期是Lifecycle、LiveDa、ViewModel等组件的基础。在对生命周期知识掌握不牢靠的情况,去研究那些组件,无异于空中楼阁。

文末

在这里为了方便大家系统的学习jetpack组件,这里特意联合了阿里P7架构师和谷歌技术团队共同整理了一份Jetpack全家桶学习资料。

由于内容较多这里只展现部分,完整文档扫描下方二维码免费领取!

Jetpack架构组件从入门到精通

1. 什么是Jetpack

1.1 简介

Jetpack是一套库、工具和指南,可以帮助开发者更轻松地编写优质应用。这些组件可以帮助开发者遵循最佳做法、

让开发者摆脱编写样板代码的工作并简化复杂任务,以便开发者将精力集中放在所需的代码上。

1.2 特性

1. 加速开发 组件可以单独采用(不过这些组件是为协同工作而构建的),同时利用Kotlin语言功能帮助开发者提高工

作效率。

2. 消除样板代码 Android Jetpack可管理繁琐的Activity(如后台任务、导航和生命周期管理),以便开发者可以专注

于如何让自己的应用出类拔萃。

3. 构建高质量的强大应用 Android Jetpack组件围绕现代化设计实践构建而成,具有向后兼容性,可以减少崩溃和内

存泄漏。

1.3 分类

Architecture**(架构组件)可帮助您设计稳健、可测试且易维护的应用。**

\1. Data Binding**:**

是一种支持库,借助该库,可以以声明方式将可观察数据绑定到界面元素。2. Lifecycles**:**

管理Activity 和 Fragment的生命周期,能够帮助开发者轻松的应对Activity/Fragment的生命周期

变化问题,帮助开发者生成更易于维护的轻量级代码。

\3. LiveData**:**

在底层数据库更改时通知视图,是可观察的数据持有者类。与常规的可观察对象不同,LiveData具

有生命周期感知功能(例如Activity,Fragment或Service的生命周期)。

\4. Navigation**:**

处理应用内导航所需的一切。

\5. Paging**:**

逐步从您的数据源按需加载信息,帮助开发者一次加载和显示小块数据。按需加载部分数据可减少网

络带宽和系统资源的使用。

\6. Room**:**

流畅地访问 SQLite 数据库。在SQLite上提供了一个抽象层,以在利用SQLite的全部功能的同时允许更

健壮的数据库访问。

\7. ViewModle**:**

以注重生命周期的方式管理界面相关的数据。ViewModel类允许数据幸免于配置更改(例如屏幕

旋转)。通常和DataBinding配合使用,为开发者实现MVVM架构提供了强有力的支持。

\8. WorkManager**:**

管理 Android 的后台作业,即使应用程序退出或设备重新启动,也可以轻松地调度预期将要

运行的可延迟异步任务。

Foundation**(基础组件)可提供横向功能,例如向后兼容性、测试和** Kotlin 语言支持。

\1. Android KTX**:**

编写更简洁、惯用的 Kotlin 代码,是一组Kotlin扩展程序。优化了供Kotlin使用的Jetpack和

Android平台API。旨在让开发者利用 Kotlin 语言功能(例如扩展函数/属性、lambda、命名参数和参数默认

值),以更简洁、更愉悦、更惯用的方式使用 Kotlin 进行 Android 开发。Android KTX 不会向现有的 Android

API 添加任何新功能。

\2. AppCompat**:**

帮助较低版本的Android系统进行兼容。

\3. Auto**:**

有助于开发 Android Auto 应用的组件。是 Google推出的专为汽车所设计之 Android 功能,旨在取代

汽车制造商之原生车载系统来执行 Android应用与服务并访问与存取Android手机内容。

\4. Benchmark**:**

从 Android Studio 中快速检测基于 Kotlin 或 Java 的代码。

\5. Multidex**:**

为具有多个 DEX 文件的应用提供支持。

\6. Security**:**

按照安全最佳做法读写加密文件和共享偏好设置。

\7. Test**:**

用于单元和运行时界面测试的 Android 测试框架。

\8. TV**:**

有助于开发 Android TV 应用的组件。

\9. Wear OS by Google**:**

有助于开发 Wear 应用的组件。

Behavior**(行为组件)可帮助您的应用与标准** Android 服务(如通知、权限、分享和 Google 助理)相集成。

\1. CameraX**:**

简化相机应用的开发工作。它提供一致且易于使用的 API 界面,适用于大多数 Android 设备,并

可向后兼容至 Android 5.0(API 级别 21)。

\2. DownloadManager**:**

是一项系统服务,可处理长时间运行的HTTP下载。客户端可以请求将URI下载到特定的

目标文件。下载管理器将在后台进行下载,处理HTTP交互,并在出现故障或在连接更改和系统重新启动后重试

下载。

\3. Media & playback**:**

用于媒体播放和路由(包括 Google Cast)的向后兼容 API。

\4. Notififications**:**

提供向后兼容的通知 API,支持 Wear 和 Auto。

\5. Permissions**:**

用于检查和请求应用权限的兼容性 API。

\6. Preferences**:**

创建交互式设置屏幕,建议使用 AndroidX Preference Library 将用户可配置设置集成至应用

中。

\7. Sharing**:**

提供适合应用操作栏的共享操作。

\8. Slices**:**

是UI模板,可以通过启用全屏应用程序之外的互动来帮助用户更快地执行任务,即可以创建在应用外

部显示应用数据的灵活界面。

UI**(界面组件)可提供微件和辅助程序,让您的应用不仅简单易用,还能带来愉悦体验。了解有助于简化界面开发的**

Jetpack Compose**。**

\1. Animation & transitions**:**

使开发者可以轻松地为两个视图层次结构之间的变化设置动画。该框架通过随时

间更改其某些属性值在运行时为视图设置动画。该框架包括用于常见效果的内置动画,并允许开发者创建自定义动画和过渡生命周期回调。

\2. Emoji**:**

使Android设备保持最新的最新emoji表情,开发者的应用程序用户无需等待Android OS更新即可获取

最新的表情符号。

\3. Fragment**:** Activity的模块化组成部分。

\4. Layout**:**

定义应用中的界面结构。可以在xml中声明界面元素,也可以在运行时实例化布局元素。

\5. Palette**:**

是一个支持库,可从图像中提取突出的颜色,以帮助开发者创建视觉上引人入胜的应用程序。开发者

可以使用调色板库设计布局主题,并将自定义颜色应用于应用程序中的视觉元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值