Android框架式编程之Lifecycle

 Lifecycle官方文档地址:https://developer.android.com/topic/libraries/architecture/lifecycleandroid

1、为何要使用Lifecycle?

Activity 和 Fragment 是有声明周期的,开发时咱们的不少操做须要写在声明周期的方法中,好比,下载、文件操做等。这样不少状况下会致使,咱们在 Activity中 的声明周期方法中写愈来愈多的代码,从而使得 Activity 或者 Fragment 愈来愈臃肿,代码维护愈来愈困难。这时咱们使用Lifecycle就能够很好的解决这类问题。
Lifecycle代码简洁,咱们能够经过实现LifecycleObserver 接口来监听声明周期,而后咱们在Activity和Fragment中去注册监听。git

Lifecycle 的原理图以下:github

 看完原理图后,咱们应该对Lifecycle有一些简单的理解和认知了,下面咱们来说述一下Lifecycle如何使用。编程

2、Lifecycle 的使用说明

2.1 几个重要的类和接口

Lifecycle Lifecycle是一个持有组件生命周期状态(如Activity或Fragment)的信息的类,并容许其余对象观察此状态。网络

Event :从框架和Lifecycle类派发的生命周期事件。这些事件映射到活动和片断中的回调事件。框架

State :由Lifecycle对象跟踪的组件的当前状态。编程语言

LifecycleOwner (重要)Lifecycle持有者:实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。ide

LifecycleObserver(重要)Lifecycle观察者:实现该接口的类,经过注解的方式,能够经过被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver即可以观察到LifecycleOwner的生命周期事件。测试

2.2 LifeCycleOwner 和 LifecycleObserver 

(1). LifecycleOwner(生命周期持有者接口)

简单来讲,LifecycleOwner 就是一个接口,谁继承了它,就持有了lifecycle对象。而后就能够调用getLifecycle()方法获取继承了抽象类Lifecycle的LifecycleRegistry,而后调用 addObserver(@NonNull LifecycleObserver observer) 方法来注册监听。
这样,该接口的生命周期 (Lifecycle对象) 的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。ui

注意:Support Library 26.1.0 及其之后的版本,Activity 和Fragment 已经实现了LifecycleOwner 接口。咱们能够直接在Activity 和Fragment中使用getLifecycle()方法来获取 Lifecycle 对象,来添加观察者监听。

(2). LifecycleObserver(生命周期观察者接口)

LifecycleObserver 是一个观察者接口,实现了它,能够经过注解或者继承的方式,来管理声明周期的监听。只要在持有lifecycle的类中注册了它,当声明周期发生变化时,它就能收到,进行咱们自定义的操做。

3、Lifecycle 实战

目前Activity能够不用实现 LifecycleOwner,从API14开始 AppCompatActivity已经在内部实现了 LifecycleOwner,咱们只须要使用AppCompatActivity结合Lifecycle一块儿使用便可。

页面代码:

public class MainActivity extends AppCompatActivity {

    MyObserver myObserver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myObserver = new MyObserver();
        getLifecycle().addObserver(myObserver);
    }

    public void toSecond(View view) {
        startActivity(new Intent(this, SecondActivity.class));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getLifecycle().removeObserver(myObserver);
    }
}

组件监听代码:

package com.renhui.lifecycle;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;

public class MyObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void ON_CREATE() {
        System.out.println("MyObserver:ON_CREATE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void ON_START() {
        System.out.println("MyObserver:ON_START");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void ON_RESUME() {
        System.out.println("MyObserver:ON_RESUME");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void ON_PAUSE() {
        System.out.println("MyObserver:ON_PAUSE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void ON_STOP() {
        System.out.println("MyObserver:ON_STOP");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void ON_DESTROY() {
        System.out.println("MyObserver:ON_DESTROY");
    }
}

Demo地址:https://github.com/renhui/LiftCycle-master

4、进阶用法 

咱们能够在初始化MyObserver的时候将lifecycle传入,在MyObserver中进行操做时再次确认宿主的”生命周期”状态。

if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
  //do something
}

另外,官网提供了生命周期感知组件的最佳实战的建议:

  1. 尽量保持您的UI控制器(活动和片断)尽量精简。他们不该该试图获取他们本身的数据;相反,使用ViewModel来作到这一点,并观察一个LiveData对象来反映更改回视图。
  2. 尝试编写数据驱动的用户界面,其中您的用户界面控制器的职责是在数据更改时更新视图,或将用户操做通知给ViewModel。
  3. 把你的数据逻辑放在ViewModel类中。ViewModel应做为您的UI控制器和其余应用程序之间的链接器。但要当心,ViewModel不负责提取数据(例如,来自网络)。相反,ViewModel应调用相应的组件来获取数据,而后将结果提供给UI控制器。
  4. 使用dataBinding在视图和UI控制器之间保持干净的界面。这使您可使您的视图更具说明性,并最大限度地减小须要在活动和片断中编写的更新代码。

若是你喜欢用Java编程语言来作到这一点,可使用像Butter Knife这样的库来避免样板代码而且有更好的抽象。

  1. 若是您的UI很复杂,请考虑建立一个演示者类(presenter)来处理UI修改。这多是一项艰巨的任务,但它可使您的UI组件更易于测试。
  2. 避免在ViewModel中引用View或Activity上下文。

若是ViewModel超出活动(在配置更改的状况下),则活动会泄漏而且垃圾收集器没法正确处理。

相关文章
相关标签/搜索