我们这里用到了


Chronometer


一个陌生的控件。根据语义,他是用来记录精准时间的。。

Android jetpack LifeCycle 在Ativity中的应用_android jetpack

会自己弄一个计时器这样

现在我们要做一个需求

写一个计时器。在看到这个页面 计时器就开始运作、看不到了 就停止运作

布局

<?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=".MainActivity">

<Chronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

代码

package com.anguomob.jecpack

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.SystemClock
import com.anguomob.jecpack.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
var elapsedTime: Long = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}

override fun onResume() {
super.onResume()
binding.chronometer.base = SystemClock.elapsedRealtime() - elapsedTime
binding.chronometer.start()
}

override fun onPause() {
super.onPause()
elapsedTime = SystemClock.elapsedRealtime() - binding.chronometer.base
binding.chronometer.stop()
}

}

效果

Android jetpack LifeCycle 在Ativity中的应用_sed_02


SystemClock.elapsedRealtime()


返回系统启动到现在的时间,包含设备深度休眠的时间。该时钟被保证是单调的,即使CPU在省电模式下,该时间也会继续计时。该时钟可以被使用在当测量时间间隔可能跨越系统睡眠的时间段。

就是我们在退出的时候

可以捋一下逻辑 打下tag

在我们第一次进入

Android jetpack LifeCycle 在Ativity中的应用_android_03

首先我们进入app

Android jetpack LifeCycle 在Ativity中的应用_xml_04

我们点击Home返回主页

Android jetpack LifeCycle 在Ativity中的应用_android jetpack_05

 再次进入app

Android jetpack LifeCycle 在Ativity中的应用_android_06

 base会根据你退出到app进行调整。让时间显得慢了下来。当然这里不是重点。

重点是使用LifeCycle

抽取一个类 继承 


Chronometer 并实现


LifecycleObserver


然后 

package com.anguomob.jecpack.view

import android.content.Context
import android.os.SystemClock
import android.util.AttributeSet
import android.widget.Chronometer
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent

class MyChronometer(context: Context?, attrs: AttributeSet?) : Chronometer(context, attrs),
LifecycleObserver {
var elapsedTime = 0L

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume() {
base = SystemClock.elapsedRealtime() - elapsedTime
start()
}


@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause() {

elapsedTime = SystemClock.elapsedRealtime() - base
stop()
}
}

方法名称是可以随便写的 这里写了onResume. 你也可以用别的乱起八糟的都没问题

主要是注解不要错误

布局

<?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=".MainActivity">

<com.anguomob.jecpack.view.MyChronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

效果和那个一样

Android jetpack LifeCycle 在Ativity中的应用_android jetpack_07

but

main代码

package com.anguomob.jecpack

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.SystemClock
import android.util.Log
import com.anguomob.jecpack.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
var elapsedTime: Long = 0
private val TAG = "MainActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
lifecycle.addObserver(binding.chronometer)



}



}

 只需要在main的地方添加一下监听就好啦。

这样写好处很多

第一个就是 main的业务代码很少。很干净。

第二个就是代码超级干净 复用性简便就成为了可能。

上面继承了一个倒计时组件。也可以不继承。直接实现

Android jetpack LifeCycle 在Ativity中的应用_xml_08

 

然后需要的地方调用即可

//引用启动的时候做这些操作
fun onCreate(activity: AppCompatActivity) {
activity.lifecycle.addObserver(AnGuoMain(activity))
}