1、前言

最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。

Android Architecture组件是Android Jetpack的一部分,它们是一组库,旨在帮助开发者设计健壮、可测试和可维护的应用程序,包含一下组件:

  • Android Jetpack组件总览
  • Android Jetpack 组件之 Lifecycle使用
  • Android Jetpack 组件之 Lifecycle源码
  • Android Jetpack组件之ViewModel使用
  • Android Jetpack组件之 LiveData使用-源码
  • Android Jetpack组件之 Paging使用-源码
  • Android Jetpack组件之 Room使用-源码
  • Android Jetpack组件之Navigation使用-源码
  • Android Jetpack组件之WorkManger使用介绍
  • Android Jetpack组件App Startup简析
  • Android Jetpack组件之Hilt使用

本系列文章是各处copy过来的,个人感觉所有的开发者都应该尽早的熟悉Jetpack组件,相信一定会被它的魅力所吸引,最近也在完成一个使用以上所有组件实现的项目,作为对Jetpack组件的项目实践,下面来分析一下每个组件对项目开发的帮助。

二、Lifecycles的作用

lifecycles简介:

Lifecycles是一个持有组件生命周期状态(如Activity或Fragment)信息的类,并允许其他对象观察此状态。生命周期使用两个主要枚举来跟踪其关联组件的生命周期状态:

  • Event:从框架和Lifecycle类派发的生命周期事件。 这些事件映射到活动和片段中的回调事件。
  • State:由Lifecycle对象跟踪的组件的当前状态。

lifecycles使用场景

Lifecycles:生命周期感知组件,从名字中就可以知道,这个方法是处理生命周期的相关的操作。在平时的开发过程中,我们难免有些逻辑的执行是和UI的生命周期相结合的,需要在特定的生命周期中执行相应的方法,我们平时做的可能就是在View中的每个周期调用Present中获取数据的方法,然后在调用View的回调接口更新UI,但现在使用Lifecycles可以使用注解和观察的模式自动调用Observe中定义好的方法。

我们看个简单的例子,我们需要在每个周期Toast周期的名字,那我们就要在每个周期方法中调用:

override fun onResume() {super.onResume()toast("onResume")}override fun onPause() {super.onPause()toast("onPause")}override fun onDestroy() {super.onDestroy()toast("onDestroy")}

上述情况属于直接调用生命周期方法,当需要调用其他类中的方法并且需要回调时,此时可能会想到使用接口实现,在相应的生命周期中调用方法,在处理完数据后使用接口回调数据:

  • 生命数据处理的类MyLocationListener
class MyLocationListener {public MyLocationListener(Context context, Callback callback) {// ...}void start() {// connect to system location service}void stop() {// disconnect from system location service}
}
  • 调用类中的方法并设置回调
class MyActivity : AppCompatActivity {var myLocationListener :MyLocationListeneroverride fun onCreate(...) {myLocationListener = new MyLocationListener(this, location -> {});}@Overrideoverride fun  onStart() {super.onStart();Util.checkUserStatus(result -> {if (result) {myLocationListener.start();}});}@Overrideoverride fun  onStop() {super.onStop();myLocationListener.stop();}
}

上述是我们平时开发最常用的接口方法,这样做虽然也很方便,但这种模式导致代码的高度耦合,并且通常我们希望实现重量更轻的代码,这些代码更易于维护,下面我们来看看LifeCycles的使用。

三、Lifecycles的使用

  • gradle的引入(此处以Kotlin语言为例)
// ViewModel and LiveDataimplementation "android.arch.lifecycle:extensions:$lifecycle_version"// alternatively - just ViewModelimplementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin// alternatively - just LiveDataimplementation "android.arch.lifecycle:livedata:$lifecycle_version"// alternatively - Lifecycles only (no ViewModel or LiveData).//     Support library depends on this lightweight importimplementation "android.arch.lifecycle:runtime:$lifecycle_version"annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"// alternately - if using Java8, use the following instead of compilerimplementation "android.arch.lifecycle:common-java8:$lifecycle_version"// optional - ReactiveStreams support for LiveDataimplementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
  • 创建MyObserver
class MyObserver(var lifecycle: Lifecycle, var callback: CallBack) : LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)public fun connectOnCreate() {p("connectOnCreate")}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)public fun connectOnResume() {p("connectOnResume")}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)public fun disConnectOnDestroy() {p("disConnectOnDestroy")}fun p(string: String) {callback.update(string)}
}
  • 创建MyObserver 继承 LifecycleObserver
  • 传入Lifecycles和Callback,Lifecycles为绑定Activity的生命周期,CallBack用于处理数据后的回调
  • 使用注解在每个方法上标记相应的生命周期

实现一个自定义 LifecycleOwner

创建Activity并实现LifecyclesOwner,重写方法

class LifeCyclerActivity : AppCompatActivity(), LifecycleOwner {
}

创建LifecycleRegistry,并返回lifecycleRegistry

lateinit var lifecycleRegistry: LifecycleRegistrylifecycleRegistry = LifecycleRegistry(this)override fun getLifecycle(): Lifecycle {return lifecycleRegistry}

实例化创建MyObserver,绑定Lifecycles

var myObserver = MyObserver(lifecycle, object : CallBack {override fun update(string: String) {Toast.makeText(this@LifeCyclerActivity, string, Toast.LENGTH_SHORT).show()}})
lifecycle.addObserver(myObserver)

在生命周期中设置相应的标记

在OnCreate中配置onCreate的标记

lifecycleRegistry.markState(Lifecycle.State.CREATED)

添加其他生命周期回调

override fun onResume() {super.onResume()lifecycleRegistry.markState(Lifecycle.State.RESUMED)}override fun onDestroy() {super.onDestroy()lifecycleRegistry.markState(Lifecycle.State.DESTROYED)}

如果你点击到SupportActivity中查看的话,会发现SupportActivity本身就实现了LifecycleOwner,LifecyclerActivity中的很多操作都已经在SupportActivity中完成了,那么上述的使用可以直接更简化为:

class LifeCyclerActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_life_cycler)var myObserver = MyObserver(lifecycle, object : CallBack {override fun update() {Toast.makeText(this@LifeCyclerActivity, "Toast", Toast.LENGTH_SHORT).show()}})lifecycle.addObserver(myObserver)}
}

四、生命周期感知组件的最佳实践

  • 保持UI控制器(活动和片段)尽可能,不应该在活动或片段中直接获取数据;相反,使用VIEW模型来做这件事,并观察LiveData 对象,以将更改反映回视图
  • 尝试编写数据驱动的UI,其中UI控制器的职责是在数据更改时更新视图,或将用户操作通知回VIEW模型。
  • 将数据逻辑放在VIEW模型类中。VIEW模型应充当UI控制器和应用程序其余部分之间的连接器。
  • 使用数据绑定来维护视图和UI控制器之间的干净接口。如BufferKnife
  • 避免引用VIEW模型中的视图或活动上下文

Android Jetpack 组件之 Lifecycle使用相关推荐

  1. Android Jetpack 组件之 Lifecycle源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  2. Android Jetpack组件之Hilt使用

    前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. And ...

  3. Android Jetpack组件App Startup简析

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  4. Android Jetpack组件之WorkManger使用介绍

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  5. Android Jetpack组件之Navigation使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  6. Android Jetpack组件之 Room使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  7. Android Jetpack组件之 Paging使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  8. Android Jetpack组件之 LiveData使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  9. Android Jetpack组件之ViewModel使用

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

最新文章

  1. Windows7 下Ubuntu VM 中Docker连接不上的问题及解决方案
  2. 根据Apriltag进行角度和距离检测
  3. ReentrantLock可以是公平锁,sync只能是非公平锁。
  4. 在maven项目中如何引入另外一个项目
  5. 一段TCP socket和WebSocket互相交互的调试代码
  6. 机器学习入门-Knn算法
  7. 语言省考安徽考区_安徽省中小学新任教师公开招聘统一笔试 中学信息技术学科考试大纲...
  8. Flash坏块检测软件h2testw图文教程
  9. MySql适配人大金仓数据库
  10. dnplayerext2文件夹删不掉怎么解决
  11. threejs修改camera的lookAt无效怎么办
  12. Curl POST to HTTPS url gives SSLRead() error:curl: (56) SSLRead() return error -9806
  13. [iWencai]问财-热门股票排名
  14. 服务价值 100 万亿美元的行业,是时候收购市场领导者英伟达了
  15. Java位语句_卫语句 - 宿小帅的个人空间 - OSCHINA - 中文开源技术交流社区
  16. 【HTML + CSS】如何引入icon图标
  17. 基于 python 的单细胞转录因子分析
  18. 傅里叶级数展开的详细推导和部分证明
  19. SSM3==理解静态代理、动态代理Proxy.newProxyInstance、cglib代理==通过纯XML配置spring AOP,通过纯注解配置spring AOP
  20. pdf怎么去除保护限制,pdf权限限制怎么解除?

热门文章

  1. php mysql 检索跳转_jQuery+AJAX+PHP+MySQL数据库开发搜索功能,无跳转无刷新搜索。...
  2. get占位符传多个参数_未知环境下的Lidar概率占位栅格图(Occupancy Grid Map) Python代码实现...
  3. Angular使用mathjs
  4. 9.QML Qt Quick Controls 2中常用的界面形式——并排式界面(SwipeView)
  5. floyd算法_最短路径的算法:Floyd算法
  6. 【NOIP2010】引水入城
  7. 第一章 Shiro简介——跟我学习springmvc shiro mybatis
  8. maven配置默认jdk版本
  9. Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)(转载)
  10. GARFIELD@09-28-2004