Android : LifeCycles_简单应用

计时器的例子演示:

实现 按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>

相关推荐

  1. Android : LifeCycles_简单应用

    2023-12-14 03:40:02       41 阅读
  2. 反射应用简单案例

    2023-12-14 03:40:02       14 阅读
  3. Android ViewModel的简单应用

    2023-12-14 03:40:02       29 阅读
  4. Kotlin: Jetpack — ViewModel简单应用

    2023-12-14 03:40:02       37 阅读
  5. Kotlin: Jetpack — LiveData简单应用

    2023-12-14 03:40:02       52 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-14 03:40:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-14 03:40:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-14 03:40:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-14 03:40:02       20 阅读

热门阅读

  1. 【MyBatis】拦截查询结果同时动态替换

    2023-12-14 03:40:02       37 阅读
  2. 20230907docker安装MySQL配置

    2023-12-14 03:40:02       36 阅读
  3. linux 13-2day 日志轮转 日志目录 轮转参数

    2023-12-14 03:40:02       42 阅读
  4. libtorch常用函数记录

    2023-12-14 03:40:02       40 阅读
  5. 猎界新能源

    2023-12-14 03:40:02       46 阅读
  6. MATLAB Sub2ind下标值转化

    2023-12-14 03:40:02       49 阅读
  7. 配置Ubuntu18.04使iptables规则重启系统后仍然有效

    2023-12-14 03:40:02       48 阅读
  8. 计算机网络期末考试A卷及答案

    2023-12-14 03:40:02       38 阅读
  9. 嵌入式C语言(6)——数组

    2023-12-14 03:40:02       34 阅读