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>
相关推荐
Rinai_R5 分钟前
计算机组成原理的学习笔记(7)-- 存储器·其二 容量扩展/多模块存储系统/外存/Cache/虚拟存储器
笔记·物联网·学习
吃着火锅x唱着歌5 分钟前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
ragnwang8 分钟前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
胡西风_foxww1 小时前
【es6复习笔记】rest参数(7)
前端·笔记·es6·参数·rest
_Shirley1 小时前
鸿蒙设置app更新跳转华为市场
android·华为·kotlin·harmonyos·鸿蒙
hedalei3 小时前
RK3576 Android14编译OTA包提示java.lang.UnsupportedClassVersionError问题
android·android14·rk3576
锋风Fengfeng3 小时前
安卓多渠道apk配置不同签名
android
枫_feng4 小时前
AOSP开发环境配置
android·安卓
胡西风_foxww4 小时前
【es6复习笔记】函数参数的默认值(6)
javascript·笔记·es6·参数·函数·默认值
胡西风_foxww4 小时前
【es6复习笔记】生成器(11)
javascript·笔记·es6·实例·生成器·函数·gen