Android生命周期

从根本上讲,大多数Android组件都有与其相关联的生命周期。 您曾经负责处理应用程序的生命周期,这并非总是一件容易的事,尤其是对于同时进行多个异步调用而言。 无法正确处理应用程序生命周期会导致一些问题,例如内存泄漏和崩溃。 尽管您正确地管理了生命周期,但是在生命周期方法(例如onStart()和onStop()方法)中实现所有与生命周期相关的代码都是很复杂的。 简而言之,这种方法使方法难以阅读,维护和测试。

Image for post

Google document Google文档提供

因此,生命周期库通过支持实现生命周期感知组件所需的所有类和接口来提供生命周期管理的高级方法,这些类和接口可自动调整其行为,甚至响应生命周期事件而执行各种操作。 此外,不能保证组件在活动或片段停止之前就已启动。 例如,如果我们必须执行长时间运行的任务,例如在onStart()中进行一些配置检查。 这可能导致竞态条件,其中onStop()方法在onStart()之前完成。 这意味着使组件的使用寿命比需要的更长。 例如,假设我们有一个代表屏幕上设备位置的活动,如下所示:

class MyActivity : AppCompatActivity() {
    private lateinit var myLocationListener: MyLocationListener    override fun onCreate(...) {
         myLocationListener = MyLocationListener(this) { location ->
            // update UI
        }
     }    public override fun onStart() {
         super.onStart()
         Util.checkUserStatus { result ->//If this callback is invoked after activity is stopped, what    should we do?
            if (result) {
                myLocationListener.start()
            }
        }
    }    public override fun onStop() {
         super.onStop()
         myLocationListener.stop()
    }}

Lifecycle-aware components help you manage your activity and fragment lifecycles. Survive configuration changes, avoid memory leaks and easily load data into your UI.

支持生命周期的组件可帮助您管理活动和片段生命周期。 进行有效的配置更改,避免内存泄漏,并轻松将数据加载到UI中。

实际上,由于此过程是自动化的,因此Lifecycle可帮助您避免因生命周期管理不当而引起的某些问题。 结果,您的代码将更有条理。 并且更易于阅读,维护和测试。

生命周期意识的定义是什么? (What is the definition of lifecycle awareness?)

如果对象能够检测并响应应用程序中其他对象的生命周期状态变化,则该对象被称为生命周期感知。 一些Android组件(例如LiveData)已经具有生命周期意识。 另外,可以通过在类中实现LifecycleObserver接口,将任何类配置为可感知生命周期 。

生命周期 (Lifecycle)

最初,Lifecycle是一个抽象类,其中附加了Android Lifecycle。 对象可以观察到这种状态并采取适当的措施。

Lifecycle is a class that holds the information about the lifecycle state of a component (like an activity or a fragment) and allows other objects to observe this state.

生命周期是一个类,其中包含有关组件生命周期状态(如活动或片段)的信息,并允许其他对象观察此状态。

为了跟踪此状态,有两个主要概念表示为枚举:事件和状态。

Image for post

Google Document Google Document提供

实际上,在上图中,状态是图形的节点,事件是这些节点之间的边缘。 基本上,一个类可以通过在其方法中使用注释来监视组件的生命周期状态。 例如:

class MyObserver : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connectListener() {
        //...
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun disconnectListener() {
        //...
    }
}

实际上, @ OnLifecycleEvent批注可以对以下生命周期事件作出React:

  • ON_CREATE

    ON_CREATE
  • ON_DESTROY

    ON_DESTROY
  • ON_PAUSE

    ON_PAUSE
  • ON_RESUME

    ON_RESUME
  • ON_START

    ON_START
  • ON_STOP

    ON_STOP
  • ON_ANY

    任何

Note: The method assigned to the ON_ANY event will be called for all lifecycle events.

注意:将为所有生命周期事件调用分配给ON_ANY事件的方法。

之后,您可以通过调用Lifecycle类的addObserver()方法并按如下方式传递观察者的实例来添加观察者:

myLifecycleOwner.getLifecycle().addObserver(MyObserver())

您应该在活动的onCreate()方法中添加以下代码行,以便通过使用getLifecycle()。addObserver()将LifecycleOwner与LifecycleObserver关联。

生命周期所有者 (LifecycleOwner)

由具有生命周期的对象实现的接口。 片段和活动已经在支持库26.1.0+中实现了LifecycleOwner接口,并且默认情况下是LifecycleOwners。 通过使用LifecycleRegistry类并实现LifecycleObserver接口,还可以将自定义类配置为生命周期所有者。

此外,当生命周期所有者的状态更改时,将使用新状态更新分配的Lifecycle对象。 在任何时候,生命周期所有者将处于以下五个状态之一:

  • Lifecycle.State.INITIALIZED

    生命周期状态初始化
  • Lifecycle.State.CREATED

    生命周期状态创建
  • Lifecycle.State.STARTED

    生命周期状态
  • Lifecycle.State.RESUMED

    生命周期状态恢复
  • Lifecycle.State.DESTROYED

    生命周期状态被破坏

因此,当所有者状态需要处于某个生命周期阶段时,也可以使用当前状态对象的isAtLeast()方法:

if(getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { //...
}

Eventually, if you are trying to handle the lifecycle of a whole application process, you should use ProcessLifcyceOwner.

最终,如果您尝试处理整个应用程序流程的生命周期,则应使用ProcessLifcyceOwner 。

生命周期感知组件的一些用例 (Some use cases for lifecycle-aware components)

实际上,具有生命周期意识的组件可以使您在各种情况下更轻松地管理生命周期。 例如:

  1. Stopping and starting video buffering

    停止和开始视频缓冲
  2. Starting and stopping network connectivity.

    启动和停止网络连接。
  3. Pausing and resuming animated drawables.

    暂停和恢复动画可绘制对象。

实时数据 (LiveData)

此外,生命周期库为其他Android体系结构组件(包括LiveData)提供了基础。 LiveData是一个可观察的包装器,可以保存任何数据,包括列表。 LiveData具有值后,只要该值发生更改,它将通知其分配的观察者。

LiveData是可观察的数据持有者类。 与常规的可观察数据不同,LiveData具有生命周期感知功能,这意味着它尊重其他应用程序组件(例如活动,片段或服务)的生命周期。 这种意识确保LiveData仅更新处于活动生命周期状态的应用程序组件观察者。

但是,与常规的Observable相比,LiveData具有生命周期意识。 因此,它仅更新处于“活动”状态(例如STARTEDRESUMED)的观察者。 如果LifecycleOwner达到Lifecycle.State.DESTROYED状态,则LiveData将自动消除Observer。 这种生命周期意识可帮助您避免在尝试更新已停止的“活动”或“片段”时可能发生的崩溃。 每当一个组件进入启动状态时,它自动接收从LiveData对象被观察的最新值。 如果恢复活动或片段,或者在配置更改过程中重新创建了活动或片段,它将接收最新数据。

Google的生命周期感知组件的一些最佳做法 (Some best practices for lifecycle-aware components by Google)

  1. Keep your UI controllers (activities and fragments) as lean as possible by using LiveData and ViewModel

    通过使用LiveData和ViewModel使UI控制器(活动和片段)保持精简

2.将数据逻辑放入ViewModel类。 实际上,ViewModel应该用作UI控制器与应用程序其余部分之间的连接器。

3.使用数据绑定来保持视图与UI控制器之间的干净连接。

4.避免在ViewModel中引用View或Activity上下文。

参考

https://blog.csdn.net/weixin_26739079/article/details/108259720

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值