LifeCycle说明:
    1、使用mockLocation,此LifeActivity是ComponentActivity的子类,所以也是LifeCycleOwner的实现类
    2、MockLocation模拟定位服务,这里面就持有了lifeCycleOwner,且其实现了LifeCycleObserver,就能感知到UI的生命周期
    3、如此调用,则定位服务就能根据生命周期,来决定回调。
    4、倘若没有这类生命周期管理,需要手动关联,onStart定位 onStop 停止,则会出现在onCreate中调用startLocation的话,
    由于某些异常情况,导致可能会出现,先走到了location的onStop,后 onStart,可能就出异常报错。

1. 布局xml文件 activity_lifecycle.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"><Viewandroid:id="@+id/v_center_line"android:layout_width="match_parent"android:layout_height="1dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf="parent" /><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/tv_flag_left_vm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="LifeCycle操作演示"app:layout_constraintBottom_toTopOf="@id/v_center_line"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent" /><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/btn_left_vm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="查看ViewModel的值"android:textAllCaps="false"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/v_center_line" /></androidx.constraintlayout.widget.ConstraintLayout>

2. MockLocation.kt

class MockLocation(private val owner: LifecycleOwner?, private val callBack: LocationCallBack?) :LifecycleEventObserver {private val TAG = MockLocation::class.java.simpleNameprivate var enable = false// region 如此则会自动感知生命周期,并调用相应操作 ,如果是实现LifecycleObserver的接口,可以这么根据event单独处理。//如果是实现了LifecycleEventObserver,就不需要这个region块,而是使用onStateChanged的处理@OnLifecycleEvent(Lifecycle.Event.ON_START)fun onStart() {if (enable) {//开始定位,在此之前可能需要检测网络、用户信息、等各种状态,存在耗时,若不用lifecycle时候,就会出现在这里耗时检测// 而未真的start定位之前,activity就被stop,同时listener也被调用stop,即出现了本listener在start之前调用了stop的异常现象Log.i(TAG, "onStart")}}@OnLifecycleEvent(Lifecycle.Event.ON_STOP)fun onStop() {// do some stop operateLog.i(TAG, "onStop")}//endregion/*** 开始模拟定位*/fun startLocation() {enable = trueif (owner!!.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {//判断,如果没有开始定位,就再次开启定位,定位成功,使用callback回调UI刷新callBack?.onSuccess()}}override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {when (event) {Lifecycle.Event.ON_CREATE -> {Log.i(TAG, "ON_CREATE")}Lifecycle.Event.ON_START -> {Log.i(TAG, "ON_START")}Lifecycle.Event.ON_RESUME -> {Log.i(TAG, "ON_RESUME")}Lifecycle.Event.ON_PAUSE -> {Log.i(TAG, "ON_PAUSE")}Lifecycle.Event.ON_STOP -> {Log.i(TAG, "ON_STOP")}Lifecycle.Event.ON_DESTROY -> {Log.i(TAG, "ON_DESTROY")}else -> {Log.i(TAG, "OTHER")}}}interface LocationCallBack {fun onSuccess()}
}

3. 测试页面 LifeActivity.kt

/*** LifeCycle的演示页面*/
class LifeActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_lifecycle)btn_left_vm.setOnClickListener {startActivity(Intent(this, VmActivity::class.java))}//调用定位val mockLocation = MockLocation(this, object : MockLocation.LocationCallBack {override fun onSuccess() {//此时的回调,就是确保了,已经在UI显示的状态,Log.d("MockLocation", "onSuccess")}})mockLocation.startLocation()//mockLocation.onStart()//mockLocation.onStop()lifecycleScope.launchWhenCreated {Log.d("MockLocation", "launchWhenCreated")}}override fun onStart() {super.onStart()}
}

4. LiftCycle 与 ViewModel
  4.1 继承 ViewModel,Vvm.kt

/*** ViewModel*/
class Vvm : ViewModel() {private val TAG = ViewModel::class.java.simpleNameval vvm = "vvm 的 vvm"init {Log.d(TAG, "Vvm init")}override fun onCleared() {super.onCleared()Log.e(TAG, "Vvm onCleared")}
}//android application 的viewModel
class VaVm(application: Application) : AndroidViewModel(application) {private val TAG = ViewModel::class.java.simpleNameval vam = "vApplication 的 vavm"init {Log.d(TAG, "VaVm init")}override fun onCleared() {super.onCleared()Log.e(TAG, "VaVm Cleared")}
}

4.2 测试页面 VmActivity.kt

class VmActivity : AppCompatActivity() {private val TAG = VmActivity::class.java.simpleName//创建方法val vm by viewModels<Vvm> {defaultViewModelProviderFactory}val vavm by viewModels<VaVm> {defaultViewModelProviderFactory}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_lifecycle)tv_flag_left_vm.text = "当前为 vm 的演示界面"btn_left_vm.text = "关闭"btn_left_vm.setOnClickListener { finish() }Log.i(TAG, "vm 的值 ${vm.vvm}")Log.i(TAG, "vavm 的值 ${vavm.vam}")//创建 vm 的方式,其实原理一样的val vvv = ViewModelProvider(this).get(Vvm::class.java)val vavm = ViewModelProvider(this).get(VaVm::class.java)Log.d(TAG, "vm的值 ${vvv.vvm}")Log.d(TAG,"vavm的值 ${vavm.vam}")}
}

LifeCycle 的使用和原理相关推荐

  1. Android Jetpack组件ViewModel基本使用和原理分析

    本文整体流程:首先要知道什么是 ViewModel,然后演示一个例子,来看看 ViewModel 是怎么使用的,接着提出问题为什么是这样的,最后读源码来解释原因! 1.什么是ViewModel 1.1 ...

  2. Lifecycle LiveData LiveData LiveData

    0001Lifecycle 原文:http://shymanzhu.com/2017/12/02/Android%20架构组件%EF%BC%88一%EF%BC%89--Lifecycle-Aware% ...

  3. 在 Jetpack Compose 中安全地使用数据流

    /   今日科技快讯   / 11月17日下午,暴雪中国官方微博发布公告称,各位暴雪游戏的国服玩家,我们很遗憾地通知大家,随着我们与网之易公司现有授权协议的到期,自2023年1月24日0点起,所有&l ...

  4. Android架构组件(二):LiveData

    前言 上篇文章我们分析了Lifecycle的使用和原理,相信我们已经学会了用Lifecycle将你所需的类添加声明周期管理,如果只是寥寥阅读也没关系,这里奉上(双膝跪地)上篇地址,Android架构组 ...

  5. LifeCycle原理分析

    文章目录 简述 LifeCycle的原理 1.绑定观察者.被观察者 2.被观察者实现LifecycleOwn接口 3.总结 简述 解耦是永恒不变的话题,但是又不得不做.平时在onCreate方法中初始 ...

  6. Lifecycle的基本使用和原理

    一.Lifecycle的基本使用 Lifecycle是Android中引入的主要用来观察和监听Activity.Fragment生命周期的一套观察者机制. 在这个机制中有两个核心类,一个是Lifecy ...

  7. Lifecycle使用及原理讲解

    Lifecycle是Google在2017年的IO大会上推出的 Android Architecture Components中的一个,这个组件的用处就是可以感知Activity的生命周期,先来看下它 ...

  8. Lifecycle 使用及原理解析 一文搞懂

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 Lifecycle是Android Architecture Components的一员,这玩意儿挺方便的,它是能感知Activi ...

  9. Lifecycle的原理

    Lifecycle是Android Architecture Components的成员,是一个生命周期感知组件,能够感知Activity.Fragment等组件的生命周期变化,并将变化通知到已注册的 ...

最新文章

  1. c# 连接Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value:类型搞混弄出的错误...
  2. 柴油发电机组的基本结构及工作特性
  3. [HOW TO]-VirtualBox的虚拟机通过宿主机代理上网
  4. S/4HANA表现抢眼——第一季度SAP大中华区营收再现双位数增长
  5. 斗地主案例的需求分析
  6. python使用sql读取数据表并返回dataframe
  7. app 常见网络性能
  8. 一个“普通人”的秋招算法岗上岸心得
  9. 在windows2012R2安装SQLSERVER2012失败的问题之解决
  10. STM32F207通过FSMC读取ADC数据
  11. html表格复制最后一行字,为什么Word中的表格输入文字最后一行文字会自动跳到下一页...
  12. CSDN怎么自动生成目录
  13. openEuler Meetup 南京站 | 麒麟信安加入南京用户组,分享《CentOS原地透明迁移方案技术实践》
  14. ASR6601:国产M4内核LoRa SoC芯片替代SX1262/SX1278
  15. 项目中使用completablefuture_同轴线如何当网线使用?解决改造项目中难题
  16. java中的参数传递(只有值传递没有引用传递)
  17. 一幅PS作品来表现童真童趣
  18. 风格化的 Toggle Buttons
  19. Linux中的ctrl-c,ctrl-z
  20. jso是什么意思_js中this什么意思

热门文章

  1. 机器学习系列(7)_机器学习路线图(附资料)
  2. 华为云EAI应用(1)定制语言合成
  3. 2021陇剑杯部分wp
  4. 北航计算机学院王华峰,软件学院学术论坛第四次宣讲会——SCI投稿论文宣讲与点评...
  5. NB-IoT介绍(PPT)
  6. 美国有超级计算机的学校,美国计算机排名 - 目前最牛的超级计算机前五名分别是?...
  7. dnf超时空漩涡副本路线流程图_《DNF》超时空漩涡怎么走 超时空漩涡走图开荒教程攻略...
  8. ASP.Net0625金通置业企业网站
  9. 实现数据库存入html代码,并在前端就页面返回。
  10. #1353 : 满减优惠(01背包变形)