使用生命周期感知型组件处理生命周期Lifecycles

使用生命周期感知型组件处理生命周期Lifecycles


本文为学习类文档,通过学习B站up主longway777的视频,如有侵权,请联系博主进行删除

使用生命周期感知型组件处理生命周期Lifecycles

关于使用生命周期感知型组件处理生命周期Lifecycles 文档中是这么写的:

生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。

一种常见的模式是在 Activity 和 Fragment 的生命周期方法中实现依赖组件的操作。但是,这种模式会导致代码条理性很差而且会扩散错误。通过使用生命周期感知型组件,您可以将依赖组件的代码从生命周期方法移入组件本身中。

androidx.lifecycle 软件包提供了可用于构建生命周期感知型组件的类和接口 - 这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为。

注意:要将 androidx.lifecycle 导入 Android 项目

简言之就是 自创的对象去观察项目的生命周期,根据观察结果的状态执行想要执行的响应功能。

创建项目

  1. 使用计时器Chronometer,属于TextView的一个子类,可直接将TextView改为Chronometer即可使用(默认为分:秒)在这里插入图片描述
  2. 在MainActivity中添加响应代码实现进入界面时开始计时,退出界面时间停留,再次进入继续计数的功能:
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;

public class MainActivity extends AppCompatActivity {
    Chronometer chronometer;
    private long elapsedTime;  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chronometer = findViewById(R.id.meter);
        /*
        * 设定计时起点chronometer.setBase()
        * System.currentTimeMillis()——UNIX时间(1970-1-1 0:00至今)不同时区时间不同
        * SystemClock.elapsedRealtime()——系统运行实时
        */
        chronometer.setBase(SystemClock.elapsedRealtime());
        //chronometer.start(); //开始计数,留在后台依然计数,下面有onResume()此处可省略保证成对出现
    }

    @Override
    protected void onPause() {
        super.onPause();
        elapsedTime = SystemClock.elapsedRealtime() - chronometer.getBase(); //chronometer本次运行时间 = 系统运行实时-chronometer启动时起点时间
        chronometer.stop(); //模拟切出后台时停止计数
    }

    @Override
    protected void onResume() {
        super.onResume();
        chronometer.setBase(SystemClock.elapsedRealtime() - elapsedTime);  //重新设置起点时间,以达到暂停效果
        chronometer.start();  //回到界面中开启计数,但是由于chronometer创建后不会停止工作,无法实现后台停止再启动计数功能,需要添加一个变量
    }
}
  1. 运行代码
    在这里插入图片描述

增加系统维护性

创建MyChronometer类来继承系统chronometer来封装代码:
在这里插入图片描述
并根据提示创建constructor方法,选择带有属性列表的含参构造方法:
在这里插入图片描述
并实现一个接口——LifecycleObserver

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 { //实现LifecycleObserver的接口来观察生命周期
    private static long elapsedTime; //声明为静态对象以保证controller重新创建时不进行初始化(非正常方法,最好是存入ViewModel中或者是SavedState中)
    public MyChronometer(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private void pauseMeter () {
        elapsedTime = SystemClock.elapsedRealtime() - getBase();
        stop();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private void resumeMeter () {
        setBase(SystemClock.elapsedRealtime() - elapsedTime);
    }
}

MainActivity.java中删除之前写的生命周期处理事件

package com.example.lifecycles;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;

public class MainActivity extends AppCompatActivity {
    MyChronometer chronometer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chronometer = findViewById(R.id.meter);
        getLifecycle().addObserver(chronometer); //将chronometer添加为观察者
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值