Android JetPack 简介及 Work Manager 和 Navigation 组件详述 | Google 开发者大会

在 Android 诞生的第十个年头,Android 手机应用的开发应该变得更加快捷。Google 也一直在聆听开发者的心声,尽力的提升开发者在开发 Android 应用的效率。在去年,咱们听到开发者说,Android 开发的生命周期管理很困难,因此咱们推出了 lifecycle 组件。咱们还听到,当你对后台任务进行处理的时候,API 给你了5-6种不一样的解决方法,那么哪种才是你最该使用的呢?为了解决这些问题,Android JetPack 诞生了。android

咱们但愿 JetPack 不只可以提供各类功能的 API,同时,也但愿给各位开发者在开发移动应用的时候能够有一个能够依照的蓝图。安全

Android JetPack是什么以及其组成部分

什么是 Android JetPack?Android JetPack 是一套组件、工具和架构指南,咱们将现有的 support library 和架构组件联系起来。一下子大家就将看到,这些架构和组件,都是大家很是熟悉和正在使用的。网络

Android JetPack 由四个部分组成,分别是架构、界面、基础和行为,每一个部分的具体组成部分请查看下图架构

去年咱们推出的架构组件,在开发者心中得到一致好评,架构组件的优势是,你能够经过使用一个或者几个架构组件,来解决你在开发过程当中遇到的问题。在去年的基础上,今天咱们又推出的新的架构组件,分别是:WorkManager、Navigation、Paging。Paging 已经达到稳定版本,WorkManager 和 Navigation 还处在阿尔法的阶段。ide

JetPack 的第二部分是行为,行为种的大部分组件包含了你们都很是熟悉的组件,例如 Download Manager 能够进行大数据的下载,Media&Playback 和Permissions 能够帮助你们在音视频的处理和获取权限,Notifications 是对推送的处理。这些组件有一个通用的特色:他们都是向后兼容的。模块化

行为中,咱们还加入了一个新的组件:Slices。Slices 提供给应用的一个新的数据遍历的方式,如今 Slices 已经在 Google Assistant 和 Google Search 中有所体现了。函数

JetPack 的下一个部分是界面,其中包括 Fragment、Layout、Palette、Animation&Transitions、Auto.TV & Wear、Emoji 等部分。咱们但愿界面部分不但可以让界面更加好看,同时也但愿可以给用户带来好的用户体验。工具

JetPack 的最后一个部分是基础,就像他的名字的同样,它是你们在应用开发过程当中必不可少的一部分。咱们推出了 Kotlin Extensions(KTX)、经过利用 Kotlin 语言自身的特性,例如:扩展函数、属性等,KTX 能够帮助你们更好的写出简洁的 Kotlin 代码。AppCompat 是你们都很熟悉的向后兼容库,以前 v4 和 v7 在你们的开发过程当中带来了不小的麻烦,因此咱们对它进行了封装,推出了 androidx,你们能够经过使用 Android Studio3.2 来使用 androidx测试

架构组件

去年,咱们推出了一套架构指南,而且有一套组件来完成这个架构指南,经过使用架构组件,可使你的应用变得更加模块化和易于测试和维护。架构组件的宗旨是:让 Android 开发更简单。大数据

在去年的 GDD 上 ,咱们想你们介绍来4个稳定版本的架构组件他们分别是:Lifecycles、LifeData、Room 以及 ViewModel。就像下图中展现的,界面组件负责显示 UI 界面,ViewModel 负责处理 UI 数据,你可使用 LiveData 来更新数据进而更新 UI 界面。Respository 是一个惟一的数据层结构,你可使用 Room 来进行数据持久化。

在这一基础上,咱们还推出来 Paging,它能够帮你在 recyclerview 中更好的夹在分页数据。Paging 库已经达到的稳定版本。

接下来,咱们来看一下处理阿尔法阶段的两个库,Navigation。 当用户在使用你的应用时,就像下图中的同样,是你为用户设计来一个个的目的地。而且引导用户在这些目的地中浏览。咱们为导航列出来这几个必须遵循的原则:

  • 须要有一个共同的其实目的地
  • 导航的状态须要一个栈来表明的(后进先出)
  • 系统和应用的向上和返回按钮因该为用户提供统一的体验
  • 很好的支持 DeepLink

让咱们来看一下 Deep Link 的例子(如上图),在这个应用程序当中,从首页到类别到内容,一步一步的到了这样的一个页面,固然,你的用户也可能经过一个url直接来到这个界面。当你作为一个开发者,为了给用户提供这样的一个一致可预测的体验,你须要怎么作呢?,你须要对回退栈作统一。开发者在解决这个问题的时候,要么是本身把导航库的逻辑本身完成了,要么是本身写了不少代码去实现这个功能,可是代码不易于维护。而且是容易出错的。

Navigation 就是为了解决这样的问题出现的。Navigation 成功的解决了如下问题:

  • 处理 Fragment Transactions
  • 处理‘向上’和‘返回’
  • 支持 Deep Link
  • 提供动画,跳转效果

Navigation 在 Android Studio 中提供了一个可视化的导航编辑界面, 这个可视化的界面是一个xml文件,下图是一个xml文件的例子。

咱们说,Acitivty 将会做为 Navigation 的一个切入点,让 Fragment 成为内容的载体。Activity 只是负责一个所有的导航,二中间的部分咱们是交给一个 NavHost 托管的。

具体是实现导航跳转是使用 NavController 实现的,为了获取 NavController 咱们为你们提供了下面三个方法

若是你要经过一个按钮来跳转一个界面,咱们为你们提供来一个方便的方法 createNavigateOnClickListener,若是你不想用这个方法,咱们还提供来另一种方法来实现,参照下图

关于 Navigation 的跳转动画,你能够参考下图:

在导航的时候,咱们常常须要传递参数,但传递参数咱们常常须要考虑的一个问题是:咱们没法确保类型的安全。因此 Navigation 提供来一个插件 Safe Args。

一个常见的 DeepLink 类型,一般是一个通知、Shortcuts、Widget、Action 或者 Slices,咱们为这些 DeepLink 提供了一个方法叫作 NavDeepLinkBuilder。关于 NavDeepLinkBuilder 的使用方法,能够参考下图:

另一些 DeepLink,例如:URL 或者自定义的 Scheme URIs,咱们须要在 Navigation 图中加入<deepLink>标签

因为时间关系,咱们没法一一介绍 Navigation 的全部方法,因此,咱们建议开发者在会后能够亲自体验一下 Navigation

WorkManager

在 Android 开发过程当中的另一部分对于用户来讲是很是重要的,可是也是咱们看不见摸不着的,那就是后台运行。

从最开始,咱们为你们提供了 Background Services、AlarmManager,到 API 21 以后,咱们为你们提供了 Jobs,对于使用 Google Play 服务的应用,咱们又提供了 Firebase Job Dispatcher 和 GcmNetWorkManager。上图中显示了应用市场中各个 Android 系统的版本分布。你为了覆盖市场上的这些机型,你可能须要写一段很长的 if 和 else 代码来判断设备的状况,来选择合理的 API。

说到来后台运行,就不得不提设备电量的问题。在使用 Background Services 的时候,应用常常在后台自行运行,从而形成设备电量快速消耗。为了解决这个问题,Android 系统在最近的几个版本中陆续推出来减小设备电量消耗的功能,详细状况请参考下图:

目前,关于后台运行的 API,咱们选出如下下几个:

那么在上图中的几个 API 当中,咱们应该首选哪个呢?答案是 WorkManager。

WorkManager 是一个 API,它简单到只须要一个 dowork() 这样的操做,就能够很好的控制后台程序的运行。同时,它支持向后兼容。不管你在应用中是否使用 Google Play 服务,你均可以使用过 WorkManager。

举个例子,例如咱们要上传一张照片,下图中是我在上传照片中使用的 WorkManager API

针对上传图片这个操做,咱们来看一看怎么写:

在这个任务里,咱们 override 的一个doWork方法,doWork 方法会在后台运行哦,任务上传成功与否,咱们在 doWork 方法里返回。

在建立好一个任务以后,咱们还须要建立一个任务请求:

若是咱们在上传图片的过程当中没有网络怎么办?这就须要咱们在建立任务的时候添加一个约束条件:

怎样肯定照片是否上传成功?在这里咱们可使用 LiveData 来观察任务状态:

刚放给你们介绍来一个新的类叫 WorkStatus,它又两个方法,一个是 getId,一个是 getState

若是咱们想在上传照片以前先压缩,WorkManager 也提供来几个这样的方法,你能够顺序的执行或者同步执行这样的几个任务。

首先,咱们先建立一个压缩任务,在压缩任务以后再建立一个上传任务,而后使用 beginWith 和 then 把刚才的两个任务依次加群进去,就能够完成这个任务了。

若是说我想上传多张图片该怎么作呢? WorkManager 也为你们提供了一个方法来作这件事情,你们能够依次调用 enqueue 这个方法,把多个任务请求依次加入到这个方法中就能够了。

当咱们须要选择一张图片来进行上传的时候,须要输入一个 URI,咱们在进行这个任务的时候,须要一个输入值,在 WorkManager 中,提供来一个 Data 用做这个输入值,关于这个 Data 的相关介绍,请看下图:

首先,咱们给咱们的须要上传图片的 URL 一个作一个 bundle,而后把它传入到咱们的任务请求当中:

而后获取以前存入的参数,进而得到须要压缩图片的图片地址,而后把压缩图片的地址存起来:

咱们把这两个任务串起来,就是一个这样的 WorkManager 任务链:

怎样取消上传?取消上传,你可使用 cancelWorkById,可是咱们不建议你使用 id 做为任务取消时的标签。

咱们建议你们使用 Tags 来对你的任务进行标记:

而后,咱们使用 getStatusByTag 来得到 Tag 的任务或者取消任务。

在后台任务中,还又一个很是重要的功能,就是同步,同步又一个特色,就是咱们不但愿在同一个时间有多个同步任务。

为了实现这个的效果,咱们为你们提供了 UniqueWork 这个方法:

具体实现的原理以下:

目前 WorkManager 也处于阿尔法阶段,欢迎你们在会后使用 WorkManager。

这里有一些关于 Androd JetPack、Navigation 和 WorkManager 的一些资源,欢迎你们在会后进行访问。

谢谢你们!

我去推特粉一下这个小姐姐😁。

相关文章
相关标签/搜索