计时器的例子演示:
实现 按home键退出程序 暂停计时器, 打开继续运行。
1.MainActivity.java
java
package com.example.lifecycles;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Chronometer;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
//计时器 chronometer
private Chronometer chronometer;
//记录时间
private long stopTime;
//打开应用:创建onCreate --> 开始onStart-->运行onResume
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chronometer = findViewById(R.id.chronometer);
//传入时间
//System.currentTimeMillis() Unix 时间 1970 - 1-1 到现在为止经过的毫秒数
// SystemClock.elapsedRealtime() 从上一次手机启动时 到现在为止经过的毫秒数
chronometer.setBase(SystemClock.elapsedRealtime());
}
//用户按了home 键会执行 暂停onPause ->在 停止onStop
@Override
protected void onPause() {
super.onPause();
// 获取暂停的时间 从上一次手机启动时 到现在为止经过的毫秒数 - 一开始设置计时器的时间
stopTime = SystemClock.elapsedRealtime() - chronometer.getBase();
//暂停计时器
// chronometer.stop(); //只是停止了画面 计时仍在执行 没有用
}
//再次打开应用 执行重新启动onRestart--> 开始onStart-->运行onResume
@Override
protected void onResume() {
super.onResume();
// 重新设置时间 从上一次手机启动时 到现在为止经过的毫秒数 - 暂停的时间
chronometer.setBase(SystemClock.elapsedRealtime() - stopTime);
//运行的时候 启动定时器
chronometer.start();
}
}
2.activity_main.xml
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"
tools:context=".MainActivity">
<!-- 倒计时-->
<Chronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
3.使用LifeCycles 观察计时器Chronometer 生命周期
使用LifeCycles 重构代码 功能一样
MyChronometer .java
java
package com.example.lifecycles;
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;
public class MyChronometer extends Chronometer implements LifecycleObserver {
/**
* LifeCycles
* Lifecycle包括LifecycleOwner、LifecycleObserver等组件。
* 其中,LifecycleOwner是一个接口,Activity和Fragment实现了这个接口,用于定义生命周期相关的方法。
* LifecycleObserver是一个观察者,用于监听LifecycleOwner的生命周期变化。
* Lifecycle可以有效地避免内存泄漏和解决Android生命周期的常见难题。
* 通过让一些操作能够感知Activity/Fragment的生命周期,从而实现在活动状态下允许操作,而在销毁状态下需要自动禁止操作,释放资源,防止内存泄露。
* */
private long stopTime;
/**
* Initialize with standard view layout information.
* Sets the base to the current time.
* 重写计时器 观察生命周期变化
* @param context
* @param attrs
*/
public MyChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}
//观察暂停
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void pauseMethod(){
//获取暂停时间
stopTime = SystemClock.elapsedRealtime() -getBase();
stop();
}
//观察运行
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void resumeMethod(){
//重新设置时间
setBase(SystemClock.elapsedRealtime() - stopTime);
start();
}
}
MainActivity.java
java
package com.example.lifecycles;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private MyChronometer myChronometer ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myChronometer = findViewById(R.id.chronometer);
//添加观察
getLifecycle().addObserver(myChronometer);
}
}
activity_main.xml
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"
tools:context=".MainActivity">
<!-- 倒计时-->
<com.example.lifecycles.MyChronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>