Jetpack学习-Lifecycle

文章介绍了Android中的Lifecycle组件,用于跟踪Activity和Fragment的生命周期状态,以及如何通过实现LifecycleObserver接口来处理生命周期事件。文中提供了MainActivity、LifecycleService和ProcessLifecycleOwner的使用示例,展示了如何在不同场景下管理组件的生命周期,以优化内存管理和性能。Lifecycle的优势在于简化代码、避免内存泄漏和支持组件复用等。
摘要由CSDN通过智能技术生成

目录

一、Lifecycle介绍

二、使用lifecycle跟踪Activity的生命周期:

MainActivity:

 MyLifecycleObserver:

LifecycleLinstener:

运行结果: 

三、LifecycleService

下面是LifecycleService解耦Service的例子:

添加依赖:

MainActivity:

activity_main:

TaskService:

 MyTaskObserver :

四、ProcessLifecycleOwner监听应用程序的生命周期

ProcessLifecycleOwner使用例子:

添加依赖:

 MyApplication类:

  MyApplicationObserver类 :

在manifest文件中:

 运行结果:

五、Lifecycle的优点

一、Lifecycle介绍

        Android中的Lifecycle是用来跟踪Activity和Fragment的生命周期状态的。它提供了一种机制,让开发者可以在Activity或Fragment的不同生命周期状态下执行相应的操作,比如在onCreate()方法中初始化数据,在onResume()方法中启动动画等。通过实现LifecycleObserver接口,可以让一个类成为Lifecycle的观察者,从而在Activity或Fragment的生命周期状态发生变化时得到通知。Lifecycle的使用可以帮助开发者更好地管理Activity和Fragment的生命周期,避免内存泄漏等问题。

跟踪生命周期主要由:状态和事件 这两个表示。如下图:

Lifecycle的状态可以分为以下几种:

1. ON_CREATED:组件已经被创建,但是还没有被启动。

2.ON_ STARTED:组件已经被启动,但是还没有被恢复。

3. ON_RESUMED:组件已经被恢复,处于前台运行状态。

4.ON_ PAUSED:组件已经被暂停,但是仍然可见。

5. ON_STOPPED:组件已经被停止,不再可见。

6. ON_DESTROYED:组件已经被销毁,不再存在。

        在处理组件状态变化时,可以使用LifecycleObserver接口(该接口里面没有方法)和@OnLifecycleEvent注解来监听组件的生命周期事件。例如:

public class MyActivity extends AppCompatActivity implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        // 处理组件创建事件
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        // 处理组件启动事件
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        // 处理组件恢复事件
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        // 处理组件暂停事件
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        // 处理组件停止事件
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        // 处理组件销毁事件
    }
}

        通过实现LifecycleObserver接口和使用@OnLifecycleEvent注解,可以方便地监听组件的生命周期事件,并在相应的事件发生时做出相应的处理。

二、使用lifecycle跟踪Activity的生命周期:

MainActivity:

package com.example.lifecycledemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
MyLifecycleObserver mObserver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mObserver = new MyLifecycleObserver();
        // 添加观察者
        getLifecycle().addObserver(mObserver);
    }

    @Override
    protected void onStart() {
        super.onStart();
        showMessage("onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        showMessage("onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        showMessage("onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        showMessage("onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        showMessage("onDestroy()");
    }

    public void showMessage(String msg){
        Log.i("MainActivity的生命周期为:", msg);
    }
}

 MyLifecycleObserver:

package com.example.lifecycledemo;

import android.util.Log;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

public class MyLifecycleObserver implements LifecycleListener,LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    @Override
    public void onStart() {
        showMessage("ON_START");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    @Override
    public void onResume() {
        showMessage("ON_RESUME");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    @Override
    public void onPause() {
        showMessage("ON_PAUSE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    @Override
    public void onStop() {
        showMessage("ON_STOP");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    @Override
    public void onDestroy() {
        showMessage("ON_DESTROY");
    }

    public void showMessage(String msg){
        Log.i("Observer的生命周期为:", msg);
    }

}

LifecycleLinstener:

package com.example.lifecycledemo;

public interface LifecycleListener {
    void onStart();
    void onResume();
    void onPause();
    void onStop();
    void onDestroy();
}

运行结果: 

三、LifecycleService

        Android LifecycleService是一个Service,它可以感知应用程序的生命周期并在其生命周期内执行相应的操作。它是在Android 8.0(API级别26)中引入的,旨在帮助开发人员更好地管理应用程序的内存和性能。

        LifecycleService继承自Service,并实现了LifecycleOwner和LifecycleObserver接口。LifecycleOwner接口表示具有生命周期的组件,LifecycleObserver接口表示观察生命周期事件的组件。

        LifecycleService可以通过LifecycleObserver接口观察应用程序的生命周期事件,例如应用程序进入后台或前台、应用程序被销毁等。开发人员可以在这些事件发生时执行相应的操作,例如释放资源、保存数据等。

        使用LifecycleService可以帮助开发人员更好地管理应用程序的内存和性能,提高应用程序的稳定性和用户体验。

下面是LifecycleService解耦Service的例子:

添加依赖:

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


MainActivity:

package com.example.lifecycledemo2;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void startTask(View view) {
        startService(new Intent(this,TaskService.class));
    }
    public void stopTask(View view) {
        stopService(new Intent(this,TaskService.class));

    }
}

activity_main:

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

    <Button
        android:id="@+id/startGPS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始任务"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick="startTask"
        />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止任务"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.617"
        android:onClick="stopTask"
        />
</androidx.constraintlayout.widget.ConstraintLayout>


TaskService:

package com.example.lifecycledemo2;



import androidx.lifecycle.LifecycleService;

public class TaskService extends LifecycleService {
    public TaskService(){
        // 添加观察者
        MyTaskObserver observer = new MyTaskObserver(this);
        getLifecycle().addObserver(observer);
    }

}

 MyTaskObserver :

package com.example.lifecycledemo2;

import android.content.Context;
import android.util.Log;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

import java.util.Timer;
import java.util.TimerTask;

public class MyTaskObserver implements LifecycleObserver {
    Context mContext;
    Timer mTimer;
    TimerTask mTimerTask;

    public MyTaskObserver(Context context) {
        mContext = context;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void startTask() {
        mTimer = new Timer();
        mTimerTask = new TimerTask() {
            int i = 0;

            @Override
            public void run() {
                i++;
                Log.d("MyTaskObserver", "startTask: " + i);
            }
        };
        mTimer.schedule(mTimerTask, 0, 1000);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void stopTask() {
        if (mTimer != null) {
            mTimer.cancel();
        }
        Log.d("MyTaskObserver", "stopTask: ");
    }}

         上述代码实现了一个后台任务的生命周期管理,通过实现LifecycleObserver接口和使用@OnLifecycleEvent注解,可以在任务开始和结束时执行相应的操作。TaskService继承自LifecycleService,可以获取到当前任务的生命周期状态,并且添加MyTaskObserver观察者,实现任务的启动和停止。MyTaskObserver中定义了一个定时器任务,在任务启动时开始执行,每隔1秒输出一次日志,任务停止时取消定时器任务。这样可以保证任务在后台运行时不会一直占用资源,同时在任务不需要时及时释放资源。

四、ProcessLifecycleOwner监听应用程序的生命周期

Android ProcessLifecycleOwner 是 Android Architecture Components 中的一个类,用于帮助开发者管理应用程序的生命周期。它是一个单例类,可以在应用程序的整个生命周期中跟踪应用程序的前台和后台状态,并在应用程序进入后台时触发回调方法。

ProcessLifecycleOwner 可以通过添加依赖库 "androidx.lifecycle:lifecycle-process" 来使用。在应用程序的 Application 类中,可以通过以下方式获取 ProcessLifecycleOwner 实例:

ProcessLifecycleOwner.get().getLifecycle().addObserver(yourObserver);

其中,yourObserver 是实现了 LifecycleObserver 接口的观察者对象,可以在其回调方法中处理应用程序的前台和后台状态变化。

ProcessLifecycleOwner 可以帮助开发者更好地管理应用程序的生命周期,例如在应用程序进入后台时停止一些后台任务,以节省资源和电量。

ProcessLifecycleOwner使用例子:

添加依赖:

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

 MyApplication类:

package com.example.lifecycle_location_demo;

import android.app.Application;

import androidx.lifecycle.ProcessLifecycleOwner;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 监听程序的生命周期
        MyApplicationObserver mObserver = new MyApplicationObserver();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(mObserver);
    }
}

  MyApplicationObserver类 :

package com.example.lifecycle_location_demo;

import android.util.Log;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

public class MyApplicationObserver implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate(){
        showMessage("Lifecycle.Event.ON_CREATE");
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart(){
        showMessage("Lifecycle.Event.ON_START");
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume(){
        showMessage("Lifecycle.Event.ON_RESUME");
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause(){
        showMessage("Lifecycle.Event.ON_PAUSE");
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop(){
        showMessage("Lifecycle.Event.ON_STOP");
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy(){
        showMessage("Lifecycle.Event.ON_DESTROY");
    }
    public void showMessage(String msg){
        Log.d("MyApplicationObserver", "showMessage: "+msg);
    }
}

在manifest文件中:

 运行结果:

(1)、打开程序:

(2)、退出程序:
 (3)、重新打开程序:

 由此可见:程序不会执行onDestroy()方法。

五、Lifecycle的优点

        Android中的Lifecycle是一个非常重要的组件,它可以帮助开发者更好地管理Activity和Fragment的生命周期。以下是Lifecycle的优点:

1. 简化代码:

        使用Lifecycle可以让开发者更轻松地管理Activity和Fragment的生命周期,避免了手动管理生命周期的繁琐代码。

2. 避免内存泄漏:

        Lifecycle可以帮助开发者避免内存泄漏,因为它可以自动处理Activity和Fragment的生命周期,确保它们在不需要时被正确地销毁。

3. 支持组件复用:

        Lifecycle可以帮助开发者更好地支持组件复用,因为它可以自动处理组件的生命周期,确保它们在不同的场景下都能正确地工作。

4. 支持异步任务:

        Lifecycle可以帮助开发者更好地支持异步任务,因为它可以自动处理Activity和Fragment的生命周期,确保它们在异步任务完成后正确地处理结果。

5. 支持测试:

        Lifecycle可以帮助开发者更好地进行单元测试,因为它可以模拟Activity和Fragment的生命周期,确保它们在不同的场景下都能正确地工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值