美文网首页jetpackAPP & program
Android-Jetpack-LifeCycle组件的使用

Android-Jetpack-LifeCycle组件的使用

作者: 阿博聊编程 | 来源:发表于2022-04-11 13:46 被阅读0次
图片来源网络

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

LifeCycle作用

  • 帮助开发者创建可感知生命周期的组件;
  • 组件能够在它的内部管理自己的生命周期,降低模块之间的耦合度;
  • 降低内存泄漏发生的可能性;
  • LifeCycleActivityFragmentServiceApplication都有用。

LifeCycle的原理

Jetpack为我们提供了两个类:

  • LifecycleOwner,被观察者;
  • LifecycleObserver,观察者。

就是通过这两个类来实现对页面的生命周期的监听。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也是同理使用。

相关文章

网友评论

    本文标题:Android-Jetpack-LifeCycle组件的使用

    本文链接:https://www.haomeiwen.com/subject/nevisrtx.html