Lifecycle的使用
2024-04-10 01:10:21  阅读数 993

前言

作为jetpack的第一篇,我还会附带解释下一些比较模糊的概念。下面来讲解下jetpack相关知识。
今天涉及知识:

  1. jetpackAndroidX
  2. Lifecycle用来做什么
  3. Lifecycle使用步骤
  4. 结合具体例子讲解Lifecycle的使用
    4.1 添加Lifecycle依赖
    4.2 在 Activity 布局中添加自定义控件的引用
    4.3 在 Activity 中添加生命周期绑定
    4.4 自定义Chronometer代码

一. jetpack 与 AndroidX

jetpack是一套Android开发标准与模板,目的是减少冗余,内存泄漏什么的,jetpack中不少的组件均收录在AndroidX中,由于Android SDK 更新比较慢,所以产生了AndroidX项目用于快速更新满足快速开发需求。大致就是这个样子。

二. Lifecycle 用来做什么

Lifecycle的产生是为了解耦业务逻辑与页面(包括ActivityFragment)生命周期严重绑定的问题。

三. Lifecycle 使用步骤

  • app_module对应的build.gradle中引入Lifecycle相关依赖
  • 让业务逻辑类实现DefaultLifecycleObserver接口,DefaultLifecycleObserver中拥有
onCreate(@NonNull LifecycleOwner owner) 
onStart(@NonNull LifecycleOwner owner)
onResume(@NonNull LifecycleOwner owner)
onPause(@NonNull LifecycleOwner owner)
onStop(@NonNull LifecycleOwner owner)
onDestroy(@NonNull LifecycleOwner owner)

生命周期,我们可以在这里处理与页面生命周期相关的业务逻辑

  • ActivityFragment中添加Lifecycle监听

四. 结合具体例子讲解 Lifecycle 的使用

4.1 添加Lifecycle依赖

app_module对应的build.gradle中添加Lifecycle依赖:

dependencies {
    // Java 8支持的 DefaultLifecycleObserver
    implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1"
   //其他代码省略 
   //......
}
4.2 在 Activity 布局中添加自定义控件的引用

这里我们自定义一个计时器控件MyChronometer,并将其计时逻辑绑定在MainActiviy生命周期中,下面给出其在MainActiviy对应布局activity_main.xml中引用代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.MainActivity">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.08" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:text="计时"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_name" />


    <com.ktdemo.function.MyChronometer
        android:id="@+id/timeChronometer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn" />

</androidx.constraintlayout.widget.ConstraintLayout>
4.3 在 Activity 中添加生命周期绑定

接着在MainActivity中给出MyChronometer绑定生命周期监听操作,代码显示如下:

@RequiresApi(Build.VERSION_CODES.N)
class MainActivity : AppCompatActivity(), View.OnClickListener {

    private lateinit var mBingding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBingding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBingding.root)

        initData()
        setListener()
    }

    private var initData = {
        mBingding.tvName.text = "我是谁"

        //绑定生命周期监听
        lifecycle.addObserver(mBingding.timeChronometer)
    }

    private var setListener = {
        LogUtil.i("====setListener=====")

        mBingding.btn.setOnClickListener(this)
    }


    override fun onClick(v: View) {
        when (v.id) {
            R.id.btn -> {
                LogUtil.i("====我点击了=====")

            }
            else -> {

            }
        }
    }

}

效果图如下:


效果图.gif
4.4 自定义Chronometer代码