Android Lifecycle Components 正式版集成

621 阅读2分钟

前言

       在Android开发中,有一个我们绕不开的话题那就是生命周期,我们所熟悉的大多数组件都有生命周期的,比如Activity、Fragment、Service,而这些生命周期由Android系统自己管理。但是想象一个这种场景,Activity或者Fragment里面有个后台线程如果我们不注意的话当后台线程的生命周期比Activity或者Fragment长的话就会有各种问题,比如内存泄露,甚至是崩溃的问题。常见的比如Activity发起一个网络请求,如果网络状况不是很好的话,我们在请求结果完成之前把Activity给finish了,一般来说网络请求是个后台任务,Activity给finish之后,网络请求成功,拿到数据对Activity的View进行渲染,这个时候往往就变得不可控了,这是个非常常见的场景。我们能想到的问题google肯定也会意识到,要不怎么能说google大法好,google适时推出了Lifecycle。简单介绍下,Lifecycle是用来响应另一个组件的生命周期状态的变化,例如Activity或者Fragment,区别于之前的alpha版本经过公测,google推出了正式版。

集成

        google教程其实已经说得很明白了,如果你只关注生命周期那么在gradle里面加入如下两行就行了:

compile "android.arch.lifecycle:runtime:1.0.3"
annotationProcessor "android.arch.lifecycle:compiler:1.0.0"

值得注意的是com.android.support的版本必须是26.1.0以上。以为这个版本及以上的FramentActivity等常用的Activity默认实现了LifecycleOwner,这点很重要,可以大大减少集成的工作量。

第一步 

对Activity等组件生命周期进行感知的组件要实现LifecycleObserver接口,直接看代码:

package com.example.administrator.lifecycledemo;

/**
 * Created by lishaojie on 2017/11/17.
 */

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.util.AttributeSet;
import android.util.Log;


public class TestClass extends AppCompatTextView implements LifecycleObserver {


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

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void create() {
            append(System.currentTimeMillis() + "-ON_CREATE\n");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void start() {
            append(System.currentTimeMillis() + "-ON_START\n");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void resume() {
           append(System.currentTimeMillis() + "-ON_RESUME\n");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void pause() {
           append(System.currentTimeMillis() + "-ON_PAUSE\n");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stop() {
           append(System.currentTimeMillis() + "-ON_STOP\n");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void destroy() {
            Log.e("destory", System.currentTimeMillis()+"ON_DESTROY");
    }
}

可以看到,TestClass需要与Activity等组件的生命周期关联起来必须实现LifecycleObserver接口然后采用注解的方式,对Activity等组件的变化进行处理。

第二步

TestClass与Activity等组件关联起来呢,如下:

package com.example.administrator.lifecycledemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TestClass testClass = (TestClass) findViewById(R.id.tv_test);
        //将LifecycleObserver与Activity关联起来
        getLifecycle().addObserver(testClass);
    }

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

因为AppCompatActivity默认实现了LifecycleOwner,所以只要这么一行代码就可以了:

getLifecycle().addObserver(testClass);

是不是很简单。运行之后按home键,结果如图:

简单吧!具体的原理等我研究透了再与大家分享!

demo地址喜欢的给个星吧!