Android LifeCycles之让组件感知生命周期的使用(生命周期观察者)

简介: Android LifeCycles之让组件感知生命周期的使用(生命周期观察者)

1.首先我们拿计时器控件Chronometer来举例说明,先不使用生命周期观察者,而是在对应的生命周期方法中实现相应的功能

首先创建xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:gravity="center"
    tools:context=".LifeCycleActivity">
    <Chronometer
        android:id="@+id/chronometer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp" />
</LinearLayout>

之后创建对应的Activity文件

public class LifeCycleActivity extends AppCompatActivity {
    private MyChronometer chronometer;
    private long elapsedTime;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_cycle);
        chronometer = findViewById(R.id.chronometer);
        getLifecycle().addObserver(chronometer);
        //系统开机时间到现在所经历的毫秒数,包括睡眠时间
        chronometer.setBase(SystemClock.elapsedRealtime());
        chronometer.start();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //用户按住home键切到其他页面, elapsedTime记录进入当前页面后计时器所经过的时间
        elapsedTime = SystemClock.elapsedRealtime()-chronometer.getBase();
    }
    @Override
    protected void onResume() {
        super.onResume();
        //用户按住home键后再次进入页面后调用此方法
        //设置计数器(chronometer)定时所参考的时间减去上一次切出去时所经历的时间
        //用户再次按home键进入页面时 从上次退出时的时间开始计时 
        chronometer.setBase(SystemClock.elapsedRealtime()-elapsedTime);
    }
}

接下来我们用生命周期观察者这个接口,实现组件感知生命周期。

首先自定义Chronometer控件,实现LifecycleObserver这个接口

public class MyChronometer extends Chronometer implements LifecycleObserver {
    private long elapsedTime;
    public MyChronometer(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private void pauseMeter() {
        elapsedTime = SystemClock.elapsedRealtime() - getBase();
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private void resumeMeter() {
        setBase(SystemClock.elapsedRealtime() - elapsedTime);
        start();
    }
}

LifecycleObserver 这个接口本身没有方法,而是依赖于OnLifecycleEvent注释方法,来实现感知生命周期。

之后在xml文件引入这个自定义的View控件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:gravity="center"
    tools:context=".LifeCycleActivity">
    <com.example.audiovisualdemo.entity.MyChronometer
        android:id="@+id/chronometer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp" />
</LinearLayout>

那么这个时候Activity文件中的代码就变得非常简洁了,不用再重写里面的生命周期方法。

public class LifeCycleActivity extends AppCompatActivity {
    private MyChronometer chronometer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_cycle);
        chronometer = findViewById(R.id.chronometer);
        //添加生命周期观察者chronometer,当生命周期更改状态时将收到通知。
        getLifecycle().addObserver(chronometer);
    }
}

最后需要的依赖为:

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'


目录
相关文章
|
2月前
|
设计模式 Android开发
[Android 四大组件] --- BroadcastReceiver
[Android 四大组件] --- BroadcastReceiver
33 0
|
3月前
|
Android开发 开发者
什么是Android Jetpack,它包括哪些组件?
什么是Android Jetpack,它包括哪些组件?
42 0
|
3月前
|
数据库 Android开发 开发者
Android基础知识:请解释Activity的生命周期。
Android基础知识:请解释Activity的生命周期。
45 2
|
4月前
|
数据库 Android开发
Android Studio开发之应用组件Application的讲解及实战(附源码,通过图书管理信息系统实战)
Android Studio开发之应用组件Application的讲解及实战(附源码,通过图书管理信息系统实战)
58 0
|
7月前
|
Android开发
Android一些特殊情况下的生命周期分析
Android一些特殊情况下的生命周期分析
43 0
|
4月前
|
XML Java Android开发
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
97 0
|
16天前
|
存储 数据库 Android开发
构建高效安卓应用:采用Jetpack架构组件优化用户体验
【4月更文挑战第12天】 在当今快速发展的数字时代,Android 应用程序的流畅性与响应速度对用户满意度至关重要。为提高应用性能并降低维护成本,开发者需寻求先进的技术解决方案。本文将探讨如何利用 Android Jetpack 中的架构组件 — 如 LiveData、ViewModel 和 Room — 来构建高质量的安卓应用。通过具体实施案例分析,我们将展示这些组件如何协同工作以实现数据持久化、界面与逻辑分离,以及确保数据的即时更新,从而优化用户体验并提升应用的可维护性和可测试性。
|
2月前
|
数据可视化 Android开发
[Android 四大组件] --- Service
[Android 四大组件] --- Service
24 0
|
2月前
|
Android开发
[Android 四大组件] --- Activity
[Android 四大组件] --- Activity
22 1
|
2月前
|
存储 数据库 Android开发
安卓四大组件是什么?
安卓四大组件是什么?