Please enable Javascript to view the contents

Jetpack

 ·  ☕ 6 分钟  ·  🎅 qqnv

Jetpack是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种Android版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。

为何使用Jetpack

  • 遵循最佳做法
    Android Jetpack组件采用最新的设计方法构建,具有向后兼容性,可以减少崩溃和内存泄露。
  • 消除样板代码
    Android Jetpack可以管理各种繁琐的Activity(如后台任务、导航和生命周期管理),以便您可以专注于打造出色的应用。
  • 减少不一致
    这些库可在各种Android版本和设备中以一致的方式运作,助您降低复杂性。

LifeCycle

作用

  • 帮助开发者建立可感知生命周期的组件
  • 组件在其内部管理生命周期,从而降低模块耦合度
  • 降低内存泄漏发生的可能性
  • Activity、Fragment、Service、Application均有LifeCycle支持

应用

  • 使用LifeCycle解耦页面与组件
  • 使用LifeCycleService解耦Service与组件
  • 使用ProgressLifeServiceOwner监听应用程序生命周期

ViewModel

要解决的问题

  • 瞬态数据丢失(保证屏幕旋转之后用户数据仍然存在)
    ViewModel的生命周期特性:独立与配置变化,无论Activity生命周期怎么变化,对ViewModel数据都没有影响,finish()时数据才会清空
  • 异步调用的内存泄漏
  • 类膨胀提高维护难度和测试难度

作用

  • 是介于View(视图)和Model(数据模型)之间的桥梁
  • 使视图和数据能够分离,也能保持通信

注意的问题

  • 不要向ViewModel中传入Context,会导致内存泄漏
  • 如果要使用Context,请使用AndroidViewModel中的Application

LiveData

作用

在ViewModel的数据发生变化时通知页面

优点

  • 确保界面符合数据状态
  • 不会发生内存泄漏
  • 不会因为Activity停止而导致内存崩溃
  • 不再需要手动处理生命周期
  • 数据始终保持最新状态
  • 适当的配置更改
  • 共享资源

DataBinding

意义

让布局文件承担了部分原本属于页面的工作,使页面与布局耦合度进一步降低

优势

  • 不再需要findViewById,项目更加简洁,可读性更高
  • 布局文件可以包含简单的业务逻辑

Room

  • Entity:实体类,对应的是数据库的一张表结构使用注释@Entity标记
  • Dao:包含一系列访问数据库的方法,使用注解@Dao标记
  • Database:数据库的持有者,作为与应用持久化相关数据的底层连接的主要接入点。使用注解@Database标记,另外需要满足以下条件:定义的类必须是一个继承于RoomDatabase的抽象类,在注解中需要定义与数据库相关联的实体类列表。包含一个没有参数的抽象方法并返回一个Dao对象

优势

  • 可视化的页面导航图,类似于Apple Xcode中的StoryBoard,便于我们理清页面关系。
  • 通过destination和action完成页面间的导航。
  • 方便添加页面切换动画。
  • 页面间类型安全的参数传递。
  • 通过NavigationUl,对菜单、底部导航、抽屉菜单导航进行统一的管理。
  • 支持深层链接DeepLink。

主要元素

  • Navigation Graph,一种新的XML资源文件,包含应用程序所有的页面,以及页面间的关系。
  • NavHostFragment,一个特殊的Fragment,可以将它看作是其他Fragment的容器,Navigation Graph中的Fragment正是通过NavHostFragment进行展示的。
  • NavController,用于在代码中完成Navigation Graph中具体的页面切换工作。
  • 他们三者之间的关系
    当你想切换Fragment时,使用NavController对象,告诉它你想要去Navigation Graph中的哪个Fragment,NavController会将你想去的Fragment展示NavHostFragment中。

作用

Fragment的切换,除了Fragment本身的切换,通常还伴有AppBar的变化,为了方便统一管理,Navigation组件引用了NavigationUI类

支持

  • AppBar
    • ActionBar
    • Toolbar
    • CollapsingToolbarlayout
  • menu
    • 抽屉菜单(DrawLayout+Navigation View)
    • 底部菜单(BottomNavigationView)

PendingIntent方式

当App收到某个通知推送,我们希望用户在点击该通知时,能够直接跳转到展示该通知内容的页面,可以通过Pendinglntent来完成。

URL方式

  • 当用户通过手机浏览器浏览网站上某个页面时,可以在网页上放置一个类似于“在应用内打开”的按钮,如果用户的手机安装有我们的App,那么通过DeepLink就能打开相应的页面;如果没有安装,那么网站可以导航到应用程序的下载页面,引导用户安装应用程序。
  • adb shell am start -a android.intent.action.VIEW -d “http://www.dongnaoedu.com/fromWeb"

WorkManager

作用

后台执行不需要及时完成的任务

特点

  • 不需要及时完成
    发送应用程序日志、同步应用程序数据、备份用户数据等
  • 保证任务一定会执行
    WorkManager有自己的数据库,关于任务的所有信息和数据都保存在数据库中,哪怕应用程序彻底退出,或者设备被重新启动,任务依然能够执行
  • 兼容范围广
    最低兼容API level14

兼容方案

  • API23以上底层用的JobScheduler
    API23以下底层用的AlarmManager+Broadcast Recevers
  • WorkManager不是一种新的线程。工作线程通常立即运行,并在任务完成后给用户反馈,而WorkManager不是即时的,不能保证任务能立即得到执行

使用方法

  • 添加依赖
  • 使用work类定义任务
  • 使用WorkRequest配置任务
    • 设置任务触发条件
    • 将任务触发条件设置到WorkRequest
    • 设置延时执行任务
    • 设置指数退避策略
    • 为任务设置tag标签
  • 将任务提交给系统
  • 观察任务的状态
  • 取消任务
  • 参数传递
  • 周期性任务
  • 任务链

Paging

支持的架构类型

  • 网络数据-页面
    • PositionDataSource
      适用于可通过任意位置加载数据,且目标数据源数量固定的情况。例如,请求时携带的参数为start=2&count=5,则表示向服务端请求从第2条数据开始往后的5条数据。
    • PageKeyedDataSource
      适用于数据源以页的方式进行请求的情况,例如,若请求时携带的参数为page=2&pageSize=5,则表示数据源以5条数据为一页,当前返回第二页的5条数据。
    • ItemKeyedDataSource
      适用于当目标数据的下一页需要依赖于上一页数据中最后一个对象中的某个字段作为key的情况,此类分页形式常见于评论功能的实现,例如,若上一页数据中最后一个对象的key为9001,那么在请求下一页时,需要携带参数since=9001&pageSize=5,则服务器会返回key=9001之后的5条数据。
  • 数据库-页面
  • 网络数据-数据库-页面
    BoundaryCallback

三个核心类

  • PagedListAdatper
  • PagedList
  • DataSource
分享

qqnv
作者
qqnv
Android Developer