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>
相关推荐
启雀AI32 分钟前
培训平台移动端离线学习方案设计与实现:视频缓存、断点续传与进度同步的工程实践
android·学习·缓存·音视频·企业lms
Fa_Mian_Tuan2 小时前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
2601_966563523 小时前
愤怒的小鸟单机版 去广告 安卓+PC端离线纯净版 益智耐玩小游戏 不需联网 老旧手机都可以玩 怀旧手机小游戏
android·智能手机
hunterandroid4 小时前
[Android 从零到一] Retrofit 请求取消与生命周期绑定:从 Call.cancel 到协程可取消设计
android
爱跑马的程序员4 小时前
安卓专有的通信子系统-Binder IPC
android·binder·ipc·安卓间通信机制
FakeOccupational4 小时前
【电路笔记 STM32】stm32f103 实现HAL_UART_Transmit_DMA + 普通模式/连续模式的 UART DMA 收发
笔记·stm32·嵌入式硬件
ue星空4 小时前
【安卓逆向】为什么用Frida?
android
小驰行动派5 小时前
Camx架构全景图:从V4L2到Pipeline的完整拆解
android·camera·android camera
北京海得康5 小时前
DMD基因治疗deramiocel遭FDA质疑,Ultragenyx DTX401即将获批
笔记
zjnlswd5 小时前
C#学习笔记2 刘铁锰
笔记·学习