jetpackAPP & program

Android-Jetpack-LifeCycle组件的使用

2022-04-11  本文已影响0人  阿博聊编程
图片来源网络

在软件开发当中,解耦可能是永恒的话题。Android开发当中的解耦体现在系统组件的生命周期和普通组件之间的解耦,LifeCycle组件可以帮助我们做到。这篇文章就来分享关于LifeCycle的知识,希望对看文章的小伙伴有所启发。

LifeCycle作用

LifeCycle的原理

Jetpack为我们提供了两个类:

就是通过这两个类来实现对页面的生命周期的监听。Activity默认实现了LifecycleOwner的接口,我们可以通过getLifecycle方法来实现观察者模式。

如果我们希望监听Activity的生命周期的时候,我们让自定义组件实现LifecycleObserver接口就可以了。

使用LifeCycle解耦页面与组件

假设我们监听用户的地理位置,想通过LifeCycle来做页面和组件的解耦,我们直接看代码示例:
1.创建一个OnLocationListener类,实现LifecycleObserver接口。重点是组件通知生命周期的变化,我们就要在方法上使用@OnLifecycleEvent(Lifecycle.Event.ON_XXX)标签进行标识。

import android.app.Activity
import android.util.Log
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.Lifecycle

class LocationListener(activity: Activity, var onLocationChangedListener: OnLocationChangedListener) :
    LifecycleObserver {
    /**
     * 当Activity执行onResume()方法时,该方法会自动调用
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private fun startGetLocation() {
        Log.d("TAG", "startGetLocation()")
    }

    /**
     * 当Activity执行onPause()方法时,该方法会自动调用
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private fun stopGetLocation() {
        Log.d("TAG", "stopGetLocation()")
    }

    interface OnLocationChangedListener {
        fun onChanged(latitude: Double, longitude: Double)
    }

    private fun initLocationManager() {
        // 初始化相关的定位管理器
    }

    init {
        // 初始化操作
        initLocationManager()
    }
}

2.在MainActivity中调用,通过getLifecycle().addObserver()方法,将观察者与被观察者绑定起来:

class MainActivity : AppCompatActivity(R.layout.activity_main) {

    @SuppressLint("UseCompatLoadingForDrawables")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(LocationListener(this,object :LocationListener.OnLocationChangedListener{
            override fun onChanged(latitude: Double, longitude: Double) {
                // 获取相关的信息
            }
        }))
    }
}

Fragment也是同理使用。

上一篇下一篇

猜你喜欢

热点阅读