懂王系列之Jetpack---Lifycycle

513 阅读1分钟

一、背景

​ 传统的MVP或者其它需要获取Activity与Fragment生命周期的方法是定义一个接口,然后在Activity或者Fragment里调用,这样使用起来非常不方便。Lifecycle就是为了解决这个问题而出现的。它可以感知到Activity、Fragment、Service的生命周期,而这种意识确保LiveData只更新处于活跃状态的应用程序组件Observe

二、传统方法

public interface INormalPresenter {
    void onCreate();
    void onDestroy();
}

public class MainActivity extends AppCompatActivity {

    private INormalPresenter mNormalPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_life_cycle);
        mNormalPresenter = new NormalPresenter();
        mNormalPresenter.onCreate();
    }

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

}

三、引入Lifecycle后

1、通过注解的方法实现
//定义实现LifecycleObserver的接口
public interface ILifeCyclePresenter extends LifecycleObserver {
}

//根据自己关注的事件实现监听
public class LifeCyclePresenter implements ILifeCyclePresenter {
    private static final String TAG = "LifeCyclePresenter";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate(@NonNull LifecycleOwner owner) {
        Log.d(TAG, "onCreate() called with: owner = [" + owner + "]");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy(@NonNull LifecycleOwner owner) {
        Log.d(TAG, "onDestroy() called with: owner = [" + owner + "]");
    }
}

//Activity里添加观察
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_life_cycle);
    getLifecycle().addObserver(new LifeCyclePresenter());
}

2、通过DefaultLifecycleObserver替代注解方式

build.gradle里添加引用

implementation "android.arch.lifecycle:common-java8:1.1.1"
public interface ILifeCyclePresenter extends DefaultLifecycleObserver {
}

public class LifeCyclePresenter implements ILifeCyclePresenter {
    private static final String TAG = "LifeCyclePresenter";

    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {
        Log.d(TAG, "onCreate() called with: owner = [" + owner + "]");
    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        Log.d(TAG, "onDestroy() called with: owner = [" + owner + "]");
    }
}

四、原理

ComponentActivity里通过添加ReportFragment(和Glide一样的原理)或者registerActivityLifecycleCallback来获取Activity的生命周期,通过LifeCycleRegistry(是LifeCycle的实现类,并持有Activity的LifeCycle弱引用)分发出去,应用可通过lifecycle.addObser()添加回调