LifeCycle

介紹

LifeCycle是一個(gè)類(lèi),包含組件的生命周期狀態(tài)的信息,并允許其他對(duì)象觀察此狀態(tài)


image.png

使用

以一個(gè)計(jì)時(shí)為例

  1. 修改TextView為Chronometer
    Chronometer是一個(gè)計(jì)時(shí)組件,繼承自TextView

  2. 在Activity中開(kāi)啟計(jì)時(shí)

chronometer = findViewById(R.id.chronometer);
// 這句可不加,默認(rèn)已經(jīng)設(shè)置
//chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();

此時(shí)一個(gè)簡(jiǎn)單的計(jì)時(shí)器就做好了,并且就算是切換到后臺(tái),計(jì)時(shí)也在繼續(xù),但是我們可能需要他只在前臺(tái)才計(jì)時(shí),繼續(xù)修改代碼

  1. 設(shè)置暫停方法
    我們分別把start()方法和stop()放在onResume()方法和onPause()方法中
@Override
protected void onResume() {
    super.onResume();
    chronometer.start();
}

@Override
protected void onPause() {
    super.onPause();
    chronometer.stop();
}

此時(shí)可以看到可以看到好像沒(méi)效果,但實(shí)際上是起作用了,可以只添加一個(gè)stop()試試,只不過(guò)這個(gè)stop()方法只是UI層面的起作用,實(shí)際上這個(gè)計(jì)時(shí)是不會(huì)停止的,所以需要在暫停時(shí)保留之前的時(shí)間,,再在繼續(xù)時(shí)減去之前的時(shí)間

  1. 修改時(shí)間
@Override
protected void onResume() {
    super.onResume();
    chronometer.setBase(SystemClock.elapsedRealtime() - elapsedTime);
    chronometer.start();
}

@Override
protected void onPause() {
    super.onPause();
    elapsedTime = SystemClock.elapsedRealtime() - chronometer.getBase();
    chronometer.stop();
}

此時(shí)就達(dá)到了我們要的效果了,然后我們還需要加上LifeCycle

  1. 新建一個(gè)類(lèi)繼承Chronometer,并實(shí)現(xiàn)LifeCycleObserver接口
package com.example.lifecycledemo;

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 {

    private long elapsedTime;

    public MyChronometer(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

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

只需要給方法加上@OnLifecycleEvent注釋?zhuān)湍軌蜃詣?dòng)監(jiān)聽(tīng)對(duì)應(yīng)組件的狀態(tài)

  1. 修改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.lifecycledemo.MyChronometer
        android:id="@+id/chronometer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
  1. 在Activity中添加觀察者
package com.example.lifecycledemo;

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.chronometer);
        getLifecycle().addObserver(chronometer);
    }
}

這樣就完成了,LifeCycle能夠根據(jù)Avctivity對(duì)應(yīng)的生命周期的狀態(tài)執(zhí)行對(duì)應(yīng)的方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容