android 控件生命周期,android 控件绑定生命周期

本文介绍了一种在Android中实现视图组件自动绑定Activity生命周期的方法。通过继承AppCompatActivity并实现LifecycleOwner接口,配合自定义控件作为LifecycleObserver,可以轻松地在组件内部响应Activity的生命周期变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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问题。

好东西一起分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值