Android生命周期组件Lifecycle使用详解,程序员的中年危机

本文详细介绍了Android应用程序中Lifecycle组件的使用,通过实例展示了如何创建LifecycleObserver以及在Activity和Fragment中集成Lifecycle,帮助开发者更好地理解和管理Android应用的生命周期状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class TestActivity extends AppCompatActivity {

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

@Override
protected void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
protected void onDestroy() {
    EventBus.getDefault().unregister(this);
    super.onDestroy();
}

}


如果我们把很多这种需要跟生命周期相关的逻辑代码都直接放在 Activity 的生命周期方法中,Activity 将会变得难以维护。通过 Lifecycle,我们就能避免这种问题。因为本质上我们需要的只是 Activity 或者 Fragment 的生命周期发生改变的时候能通知到我们,以便我们在对应生命周期中执行对应的方法。

Lifecycle 的基本使用
===============

2.0、 导入 Lifecycle 依赖
--------------------

Lifecycle 被包含在 support library 26.1.0 及之后的依赖包中,如果我们的项目依赖的支持库版本在 26.1.0及以上,那么不需要额外导入 Lifecycle 库,本篇例子中使用的支持库是 28.0.0 :

implementation ‘com.android.support:appcompat-v7:28.0.0’


如果支持库版本小于 26.1.0 ,就需要单独导入 Lifecycle 库 :

implementation “android.arch.lifecycle:runtime:1.1.1”


当然,如果项目已经迁移到了 AndroidX,可以使用下面的方式引入 :

implementation “androidx.lifecycle:lifecycle-runtime:2.0.0”


还是建议大家尝试尽快把项目迁移为AndroidX,因为很多更新,会最先在 AndroidX 中发布,逐渐摆脱传统的support包。比如这里要讲的 Lifecycle 在 AndroidX 中已经升级到了 2.x 版本,而支持库中还是 1.x 版本。

鉴于支持库一般都在 26.1.0 以上,并且尚有大部分用户未迁移到AndroidX,在本篇文章中,我们使用 `support library 28.0.0` 中默认包含的 Lifecycle 库。我们在项目的 app 目录下的 `build.gradle` 文件中添加以下依赖:

implementation ‘com.android.support:appcompat-v7:28.0.0’


以 support library 版本在 26.1.0 及以上为前提,这里我们分两种情况来讲。一种是我们创建的Activity 继承自 AppCompatActivity(以Activity 为例,Fragment类似),另一种是创建的 Activity 继承自普通的 Activity,而非 AppCompatActivity。

这里要先说一点, Lifecycle 的实现机制是观察者模式,整体上知道了这个,再讲它的使用过程就比较容易理解了:  
1\. 构建一个 Lifecycle 对象(通过一个实现了 LifecycleOwner 接口的对象的 `getLifecycle()`方法返回),这个对象就是一个被观察者,具有生命周期感知能力  
2\. 构建一个 LifecycleObserver 对象,它对指定的 Lifecycle 对象进行监听  
3\. 通过将 Lifecycle 对象的 addObserver(…) 方法,将 Lifecycle 对象和 LifecycleObserver 对象进行绑定

2.1、 继承自 AppCompatActivity
--------------------------

首先,我们创建一个 MyObserver.java 类,让它实现 LifecycleObserver 接口( LifecycleObserver 接口是一个空接口,主要是给注解处理器使用),如下:

public class MyObserver implements LifecycleObserver {

private static final String TAG = "MyObserver";

// 使用注解  @OnLifecycleEvent 来表明该方法需要监听指定的生命周期事件
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {

// …
Log.d(TAG, “connectListener: -------- onResume” );
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {

// …
Log.d(TAG, “disconnectListener: ------- onPause”);
}
}


可以看到,我们通过在方法上使用`@OnLifecycleEvent` 注解使得该方法具有了生命周期感知能力。括号里面的参数,表明需要监听的是什么生命周期事件。Lifecycle 主要就是通过 `Event` 和 `State` 这两个枚举类来跟踪所关联组件的生命周期状态。具体的 Event 和 State 之间的转换关系,可以参照下图:

![](https://user-gold-cdn.xitu.io/2019/2/27/1692ebbac5daa896?imageView2/0/w/1280/h/960/ignore-error/1)

接下来,让我们的 Activity 继承自 AppCompatActivity,然后在 onCreate(…) 方法中通过`getLifecycle().addObserver(new MyObserver())`完成 Lifecycle 和LifecycleObserver 的绑定。

public class MainActivity extends AppCompatActivity {

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

    // 就只需要这一行代码,简洁吧
    getLifecycle().addObserver(new MyObserver());
}

}


然后我们就可以运行下程序,切换到 Home 也或者按返回键,就能看到随着生命周期的变化,MyObserver() 中定义的方法在控制台中也被正确地打印了出来。

![](https://user-gold-cdn.xitu.io/2019/2/27/1692ebbac738da00?imageView2/0/w/1280/h/960/ignore-error/1)

是不是觉得特别简单。

但之所以毫不费力,是因为有人替你“负重前行”。在 `support library 26.1.0` 及以后的支持库中,AppCompatActivity 的祖先类 `SupportActivity`已经默认实现了 `LifecycleOwner` 接口,通过其 `getLifecycle()` 方法可以直接返回一个 `Lifecycle` 对象。之后我们就可以通过该对象的 addObserver(…) 方法将 Lifecycle 跟指定的 LifecycleObserver 进行绑定。

2.2、 继承自普通的 Activity
--------------------

首先,我们仍然需要像上面的方式,来创建一个`MyObserver` 对象。

这次我们创建一个继承自普通的 Activity 的 Activity ,那自然无法直接使用 getLifecycle() 方法来获取 Lifecycle 。无法直接使用,那我们能否模仿 `AppCompatActivity`的实现,来自己创建 Lifecycle 对象呢?当然可以。这时候,我们就需要自己实现`LifecycleOwner`接口,并在具体的生命周期下通过 `LifecycleRegistry` 的 `markState(...)`方法来主动进行事件的分发。请看下面改造过的 `MainActivity.java` 代码 :

public class MainActivity extends Activity implements LifecycleOwner {

private LifecycleRegistry mLifecycleRegistry;

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

    mLifecycleRegistry = new LifecycleRegistry(this);
    getLifecycle().addObserver(new MyObserver());
    mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}

@Override
protected void onResume() {
    super.onResume();
    mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
}

@Override
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值