LifeCycle 的使用和原理
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 的使用和原理相关推荐
- Android Jetpack组件ViewModel基本使用和原理分析
本文整体流程:首先要知道什么是 ViewModel,然后演示一个例子,来看看 ViewModel 是怎么使用的,接着提出问题为什么是这样的,最后读源码来解释原因! 1.什么是ViewModel 1.1 ...
- Lifecycle LiveData LiveData LiveData
0001Lifecycle 原文:http://shymanzhu.com/2017/12/02/Android%20架构组件%EF%BC%88一%EF%BC%89--Lifecycle-Aware% ...
- 在 Jetpack Compose 中安全地使用数据流
/ 今日科技快讯 / 11月17日下午,暴雪中国官方微博发布公告称,各位暴雪游戏的国服玩家,我们很遗憾地通知大家,随着我们与网之易公司现有授权协议的到期,自2023年1月24日0点起,所有&l ...
- Android架构组件(二):LiveData
前言 上篇文章我们分析了Lifecycle的使用和原理,相信我们已经学会了用Lifecycle将你所需的类添加声明周期管理,如果只是寥寥阅读也没关系,这里奉上(双膝跪地)上篇地址,Android架构组 ...
- LifeCycle原理分析
文章目录 简述 LifeCycle的原理 1.绑定观察者.被观察者 2.被观察者实现LifecycleOwn接口 3.总结 简述 解耦是永恒不变的话题,但是又不得不做.平时在onCreate方法中初始 ...
- Lifecycle的基本使用和原理
一.Lifecycle的基本使用 Lifecycle是Android中引入的主要用来观察和监听Activity.Fragment生命周期的一套观察者机制. 在这个机制中有两个核心类,一个是Lifecy ...
- Lifecycle使用及原理讲解
Lifecycle是Google在2017年的IO大会上推出的 Android Architecture Components中的一个,这个组件的用处就是可以感知Activity的生命周期,先来看下它 ...
- Lifecycle 使用及原理解析 一文搞懂
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 Lifecycle是Android Architecture Components的一员,这玩意儿挺方便的,它是能感知Activi ...
- Lifecycle的原理
Lifecycle是Android Architecture Components的成员,是一个生命周期感知组件,能够感知Activity.Fragment等组件的生命周期变化,并将变化通知到已注册的 ...
最新文章
- c# 连接Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value:类型搞混弄出的错误...
- 柴油发电机组的基本结构及工作特性
- [HOW TO]-VirtualBox的虚拟机通过宿主机代理上网
- S/4HANA表现抢眼——第一季度SAP大中华区营收再现双位数增长
- 斗地主案例的需求分析
- python使用sql读取数据表并返回dataframe
- app 常见网络性能
- 一个“普通人”的秋招算法岗上岸心得
- 在windows2012R2安装SQLSERVER2012失败的问题之解决
- STM32F207通过FSMC读取ADC数据
- html表格复制最后一行字,为什么Word中的表格输入文字最后一行文字会自动跳到下一页...
- CSDN怎么自动生成目录
- openEuler Meetup 南京站 | 麒麟信安加入南京用户组,分享《CentOS原地透明迁移方案技术实践》
- ASR6601:国产M4内核LoRa SoC芯片替代SX1262/SX1278
- 项目中使用completablefuture_同轴线如何当网线使用?解决改造项目中难题
- java中的参数传递(只有值传递没有引用传递)
- 一幅PS作品来表现童真童趣
- 风格化的 Toggle Buttons
- Linux中的ctrl-c,ctrl-z
- jso是什么意思_js中this什么意思
热门文章
- 机器学习系列(7)_机器学习路线图(附资料)
- 华为云EAI应用(1)定制语言合成
- 2021陇剑杯部分wp
- 北航计算机学院王华峰,软件学院学术论坛第四次宣讲会——SCI投稿论文宣讲与点评...
- NB-IoT介绍(PPT)
- 美国有超级计算机的学校,美国计算机排名 - 目前最牛的超级计算机前五名分别是?...
- dnf超时空漩涡副本路线流程图_《DNF》超时空漩涡怎么走 超时空漩涡走图开荒教程攻略...
- ASP.Net0625金通置业企业网站
- 实现数据库存入html代码,并在前端就页面返回。
- #1353 : 满减优惠(01背包变形)