Android : LifeCycles_简单应用

计时器的例子演示:

实现 按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>
相关推荐
Rousson3 分钟前
硬件学习笔记--82 连接器的选用原则与流程
笔记·单片机·学习
Larry_Yanan2 小时前
QML学习笔记(四十)QML的ApplicationWindow和StackView
c++·笔记·qt·学习·ui
2501_915106324 小时前
iOS 26 APP 性能测试实战攻略:多工具组合辅助方案
android·macos·ios·小程序·uni-app·cocoa·iphone
怪兽20146 小时前
IntentService 的应用场景和使用方式?
android·面试
Jeled7 小时前
云信im在Android中的使用2
android
摇滚侠7 小时前
Spring Boot 3零基础教程,Spring Boot 日志的归档与切割,笔记22
spring boot·redis·笔记
wan5555cn7 小时前
当代社会情绪分类及其改善方向深度解析
大数据·人工智能·笔记·深度学习·算法·生活
Jerry8 小时前
Compose 自定义布局和图形
android
杨筱毅8 小时前
【Android】【底层机制】组件生命周期以及背后的状态管理
android·底层机制
Jeled10 小时前
Kotlin 实现社交 App 音视频模块:语音录制、播放、暂停与进度控制全流程封装
android·kotlin·android studio·音视频