Android 绑定生命周期有很多好处,就不多说了。
AndroidX大法把绑定生命周期的思路做的非常的好,我找了网上公开的资料,都没有控件绑定生命周期这方面的文章。
Android的控件如何自动绑定生命周期?并且还要它能够在布局文件里面方便灵活的使用。
最简单的方法是,Activity使用androidx.appcompat.app.AppCompatActivity,它本身已经实现了LifecycleOwner接口,当然你也可以自己写一个。
importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.PersistableBundle;
importandroidx.annotation.NonNull;importandroidx.annotation.Nullable;importandroidx.lifecycle.Lifecycle;importandroidx.lifecycle.LifecycleOwner;importandroidx.lifecycle.LifecycleRegistry;
public abstract classBaseActivity extendsActivity implementsLifecycleOwner {
privateLifecycleRegistry lifecycleRegistry= newLifecycleRegistry(this);@NonNull@OverridepublicLifecycle getLifecycle() {
returnlifecycleRegistry;}
@Overrideprotected voidonCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);}
public voidonCreate(@NullableBundle savedInstanceState,@NullablePersistableBundle persistentState) {
super.onCreate(savedInstanceState,persistentState);lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);}
@Overrideprotected voidonStart() {
super.onStart();lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);}
@Overrideprotected voidonResume() {
super.onResume();lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);}
@Overrideprotected voidonPause() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);super.onPause();}
@Overrideprotected voidonStop() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);super.onStop();}
@Overrideprotected voidonDestroy() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);super.onDestroy();}
}
然后实现自己的控件,例如
packagecn.l.lifecycletest;importandroid.annotation.SuppressLint;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.util.Log;importandroid.widget.TextView;importandroidx.lifecycle.Lifecycle;importandroidx.lifecycle.LifecycleObserver;importandroidx.lifecycle.LifecycleOwner;importandroidx.lifecycle.OnLifecycleEvent;
@SuppressLint("AppCompatCustomView")
public classMyTextView extendsTextView {
Tactivity;publicMyTextView(finalTcontext) {
this(context,null);}
publicMyTextView(finalTcontext,AttributeSet attrs) {
super(context,attrs);activity=context;Lifecycle lifecycle= context.getLifecycle();lifecycle.addObserver(newLifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public voidonResume(){
Log.d(activity.getClass().getSimpleName()+"-TextView:","onResumed");}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public voidonPause(){
Log.d(activity.getClass().getSimpleName()+"-TextView:","onPause");}
});
}
}
这里构造方法的context 传进来的一定是Activity的实例,不会是其他的,但是构造方法的参数T泛型约束必须是Context不能是Activity,否则在布局文件里面使用,会无法实例化该控件。接下来,LifecycleObserver里面随便你写,方法名随便你定义,但是必须在方法上面附上相应的事件注解,这里面就举了两个比较常用的生命周期事件。
可以在适当的时机添加观察者,lifecycle.addObserver(),也可以在适当的时机移除观察者
activity.getLifecycle().removeObserver();
这样,你的控件就可以非常灵活观察到Activity的生命周期了。
使用
packagecn.l.lifecycletest;
importandroidx.appcompat.app.AppCompatActivity;importandroid.content.Intent;importandroid.os.Bundle;
public classMainActivity extendsAppCompatActivity {
@Overrideprotected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}
或者
public classMainActivity extendsAppCompatActivity {
@Overrideprotected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);MyTextView myTextView=newMyTextView<>(this);setContentView(myTextView);}
}
这个传进来的context保存下来,因为getContext都是莫名奇妙的为空的。
本来想用instanceof来判断传进来的context是不是implementsLifecycleOwner,但是运行时的东西必须运行才知道结果,调用者一旦忽略就麻烦了,如果抛出异常,又会存在复杂的try catch问题。
好东西一起分享!