Android - 现代 Android 开发之旅 1.架构组件

本系列文章默认读者已经熟悉基础的 Android 开发知识。如果你是一名刚刚学习 Android 的同学,不熟悉基础的开发知识,请先行学习基础内容。

什么是架构组件?

架构组件是推出的用于构建高质量的应用程序框架,其中包含来大量的最佳实践。

为什么会推出架构组件?

Android 应用程序比较复杂,包括了 Activity Fragment Service Content Provider Broadcast Receiver 等,在 Android 手机中应用程序会经常被打断,比如说:你要在微信要分享一个照片到朋友圈,微信会调起相机,这时就离开了微信,对于用户来说其实体验是完整的,而对于程序来说其实是割裂的。程序跳到相机后,相机也有可能会调起文件管理器,文件管理器又是另一个应用,此时如果一个电话打进来了,在挂断点后还需要继续回到分享照片的流程,此过程中可能还会遇到系统内存吃紧,还会被强制系统杀掉一些资源。

所以,Android 系统中应用程序间的跳转是很常见的,你的程序必须正确的处理这些流程,程序不可能像你理想中那样有序的运行,应用程序的生命周期不受你的控制,所以你不应该在与 Android 系统相关的组件中存储程序数据和状态。

而通常程序员都没有主动去处理这些,而是当程序崩溃、卡顿了才开始考虑数据和生命周期的关系。

于是 Google 就推出了架构组件组件,他可以让你更简洁的处理 Activity 的生命周期,数据恢复,减少内存泄漏的风险等。

架构组件的功能

  • Lifecycle-Aware

    是一套可以感知 Activity Fragment 生命周期的框架,其中有三个概念:

    1. Lifecycle :是一个对象,表示 Android 中的生命周期
    2. LifecycleOwner :是 Lifecycle 对外的一个接口,getLifecycle 方法可以用来获取 Lifecycle
    3. LifecycleObserver :是一个接口,用来观察 Lifecycle
  • LiveData

    是一个可被观察的数据持有类,他也是能够感知生命周期的,因为内部实现了 LifecycleObserver

    Activity
    1
    2
    3
    LiveData<User>.observe(this, Observer {
    user -> textView.text = user?.name
    })
    更新数据
    1
    2
    LiveData<User>.setValue(user) // 主线程
    LiveData<User>.postValue(user) // 异步线程

    这样更新数据后,LiveData 会自动刷新 UI

  • ViewModel

    主要作用是帮你保存引用的 UI 数据,防止因为配置变化导致 UI 数据丢失,比如旋转屏幕。

    对于数据恢复 Activity#onSaveInstanceState 也是需要提的,onSaveInstanceState 比较适合存储小数据,ViewModel 适合存大数据,比如 onSaveInstanceState 存 UserId,ViewModel 存 User 对象。

    另外这样也可以帮你把 Activity 的变量,数据,逻辑等抽离出来,让 ViewModel 保存所有 UI 数据,而 Activity 只负责 UI 的显示和交互。

    当然如果 UI 很复杂,ViewModel 可能也会变得很臃肿,那么这个时候可以考虑新建一个 Presenter 类,专门处理数据,关于 Presenter 可以参考 MVP 架构。

    Activity#onCreate ViewModel 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    val chronometerViewModel = ViewModelProviders.of(this).get(ChronometerViewModel::class.java)
    if (chronometerViewModel.startTime == null) {
    val startTime = SystemClock.elapsedRealtime()
    chronometerViewModel.startTime = startTime

    chronometer.base = startTime
    } else {
    chronometer.base = chronometerViewModel.startTime!!
    }
  • Room

    Google 自己的 SQLite ORM 框架,可以和 Rxjava LiveData 结合使用。

  • Paging New

    分页组件,可以更轻松地在 RecyclerView 中逐渐加载数据。

  • Navigation New

    简化了 Android 界面导航的实现。

  • WorkManager New

    可以轻松指定可延迟的异步任务以及何时运行。 这些 API 可让创建任务并将其交给 WorkManager,以便立即或在适当的时间运行。

总结

主要大致介绍了 Lifecycles & LiveData & ViewModel,基于,他们通常都是一起使用的。

并且从 Support-Library 26.1 开始 FragmentActivity 和 Fragment 都默认实现好了 LifecycleOwner 这些接口,引入 Support-Library 的同时也会包含 生命周期感知组件

Gavin Liu wechat
欢迎您扫一扫上面的二维码,订阅我的微信公众号!