Android : LifeCycles_简单应用

2023-12-13 04:34:38

计时器的例子演示:

实现 按home键退出程序? ?暂停计时器, 打开继续运行。

1.MainActivity.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 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

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

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 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>

文章来源:https://blog.csdn.net/jiayou2020527/article/details/134891716
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。