目录
- 一、基本使用
- 二、lifecycleobserver接口和lifecycleowner接口
- 三、getlifecycle()
- 四、绑定生命周期
- 总结
lifecycle是android architecture components的成员,是一个生命周期感知组件,能够感知activity、fragment等组件的生命周期变化,并将变化通知到已注册的观察者。正确的使用有助于更好地组织代码,减少内存泄漏,增强稳定。下面分析他的实现原理,看看到底只怎么感知生命周期的。
一、基本使用
1、引入依赖库
dependencies { def lifecycle_version = "2.5.0-alpha01" def arch_version = "2.1.0" implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" //非java8使用 annotationprocessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" //java8使用 implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" }
2、自定义一个类实现lifecycleobserver,在类中监听生命周期回调
public class basejsapi implements lifecycleobserver { @onlifecycleevent(lifecycle.event.on_create) void create() { oncreate(); } @onlifecycleevent(lifecycle.event.on_destroy) void destroy() { ondestroy(); } @onlifecycleevent(lifecycle.event.on_resume) void resume() { onresume(); } @onlifecycleevent(lifecycle.event.on_pause) void pause() { onpause(); } …………………………………… }
3、在activity或者fragment中注册。
getlifecycle().addobserver(getjsbridge());
通过以上两步就可以感知当前activity的生命周期了,非常的简便实用。
二、lifecycleobserver接口和lifecycleowner接口
public interface lifecycleobserver { } public interface lifecycleowner { @nonnull lifecycle getlifecycle(); }
lifecycleobserver是一个空接口,lifecycleowner提供getlifecycle返回lifecycle,该接口由componentactivity实现,提供了getlifecycle的实现。
三、getlifecycle()
getlifecycle方法实际上是调用的componentactivity的getlifecycle方法,通过查看,activity确实也是继承的componentactivity,该方法返回mlifecycleregistry对象,该对象继承自lifecycle,具体实现了添加观察者,移出观察者的方法,还定义了一个生命周期的枚举。
public class lifecycleregistry extends lifecycle { } public abstract class lifecycle { @mainthread public abstract void addobserver(@nonnull lifecycleobserver observer); @mainthread public abstract void removeobserver(@nonnull lifecycleobserver observer); @mainthread @nonnull public abstract state getcurrentstate(); public enum event { on_create, on_start, on_resume, on_pause, on_stop, on_destroy, on_any; ………………………………………… } ……………………………… }
也就可以看出getlifecycle().addobserver实际上就是执行lifecycleregistry的addobserver的方法添加观察者,做一个小总结如下:
观察者实现lifecycleobserver,实现需要的生命周期。在activity、fragment中添通过getlifecycle().addobserver加观察者。实际上调用的是componentactivity的getlifecycle方法返回mlifecycleregistry。调用lifecycleregistry的addobserver加观察者。三、添加观察者的流程
详情看注释:
@override public void addobserver(@nonnull lifecycleobserver observer) { //检查是否在主线程 enforcemainthreadifneeded("addobserver"); //设置状态值 state initialstate = mstate == destroyed ? destroyed : initialized; //将观察者和初始化的值封装到observerwithstate中 observerwithstate statefulobserver = new observerwithstate(observer, initialstate); //以观察者为key,statefulobserver为value放到hashmap集合中 observerwithstate previous = mobservermap.putifabsent(observer, statefulobserver); //不为null表示之前已经放进去了,否则没放进去,放进去了就添加结束 if (previous != null) { return; } //获取被观察者对象,即activity,如果被销毁了,则结束 lifecycleowner lifecycleowner = mlifecycleowner.get(); if (lifecycleowner == null) { // it is null we should be destroyed. fallback quickly return; } //maddingobservercounter 表示正在添加的观察者的数量, //开始添加新的observe之前,对该变量进行++操作,添加完成后,进行--操作。 //mhandlingevent表示是否正在处理 boolean isreentrance = maddingobservercounter != 0 || mhandlingevent; //计算状态,进行while循环 state targetstate = calculatetargetstate(observer); maddingobservercounter++; //新添加的lifecycleobserver ,会不断更新自己的生命周期到指定的targetstate while ((statefulobserver.mstate.compareto(targetstate) < 0 && mobservermap.contains(observer))) { //添加状态到list,计算当前状态,用于计算状态calculatetargetstate pushparentstate(statefulobserver.mstate); // final event event = event.upfrom(statefulobserver.mstate); if (event == null) { throw new illegalstateexception("no event up from " + statefulobserver.mstate); } //生命周期分发:分发到mlifecycleobserver里面 statefulobserver.dispatchevent(lifecycleowner, event); //移除状态到list popparentstate(); // mstate / subling may have been changed recalculate //重新计算状态 targetstate = calculatetargetstate(observer); } //没有事件正在处理,或者是添加了observe,就需要重新同步一次状态,下面详细介绍 if (!isreentrance) { // we do sync only on the top level. sync(); } maddingobservercounter--; }
//计算状态规则 private state calculatetargetstate(lifecycleobserver observer) { //在map中获取到当前observer的前一个observer map.entry<lifecycleobserver, observerwithstate> previous = mobservermap.ceil(observer); //前一个observer的state state siblingstate = previous != null ? previous.getvalue().mstate : null; //如果是嵌套添加observer,获取父级observer的状态 state parentstate = !mparentstates.isempty() ? mparentstates.get(mparentstates.size() - 1) : null; //获取最小状态,destroyed < initialized < created < started < resumed return min(min(mstate, siblingstate), parentstate); }
四、绑定生命周期
上面介绍了addobserver的流程,在componentactivity的oncreate方法中:
reportfragment.injectifneededin(this);
reportfragment是一个fragment,它负责分派生命周期的事件,injectifneededin()就是在当前的activity里添加一个reportfragment,和glide的绑定生命周期比较类似。
public static void injectifneededin(activity activity) { //当api>=29注册registerin绑定生命周期 if (build.version.sdk_int >= 29) { // on api 29+, we can register for the correct lifecycle callbacks directly lifecyclecallbacks.registerin(activity); } android.app.fragmentmanager manager = activity.getfragmentmanager(); if (manager.findfragmentbytag(report_fragment_tag) == null) { manager.begintransaction().add(new reportfragment(), report_fragment_tag).commit(); // hopefully, we are the first to make a transaction. manager.executependingtransactions(); } }
当api>=29是通过application.activitylifecyclecallbacks的方式注册生命周期, 以onstart为例,其他onresume、onpause等类似:
@override public void onstart() { super.onstart(); dispatchstart(mprocesslistener); dispatch(lifecycle.event.on_start); }
重点看看dispatch:
private void dispatch(@nonnull lifecycle.event event) { //当api<29分发dispatch绑定生命周期 if (build.version.sdk_int < 29) { // only dispatch events from reportfragment on api levels prior // to api 29. on api 29+, this is handled by the activitylifecyclecallbacks // added in reportfragment.injectifneededin dispatch(getactivity(), event); } }
不管是pplication.activitylifecyclecallbacks还是当前fragment的生命周期方式都会执行如下dispatch:
static void dispatch(@nonnull activity activity, @nonnull lifecycle.event event) { if (activity instanceof lifecycleregistryowner) { ((lifecycleregistryowner) activity).getlifecycle().handlelifecycleevent(event); return; } if (activity instanceof lifecycleowner) { lifecycle lifecycle = ((lifecycleowner) activity).getlifecycle(); if (lifecycle instanceof lifecycleregistry) { ((lifecycleregistry) lifecycle).handlelifecycleevent(event); } } }
调用lifecycleregistry的handlelifecycleevent将生命周期分发出去,lifecycleregistry上面已经介绍过了addobserve逻辑了,代码比较长,只显示关键代码:
handlelifecycleevent -> movetostate -> sync
private void sync() { lifecycleowner lifecycleowner = mlifecycleowner.get(); if (lifecycleowner == null) { throw new illegalstateexception("lifecycleowner of this lifecycleregistry is already" + "garbage collected. it is too late to change lifecycle state."); } //没有同步过,则同步 while (!issynced()) { mneweventoccurred = false; // no need to check eldest for nullability, because issynced does it for us. if (mstate.compareto(mobservermap.eldest().getvalue().mstate) < 0) { //如果observerwithstate的state小于当前state,那么就调用forwardpass方法, backwardpass(lifecycleowner); } map.entry<lifecycleobserver, observerwithstate> newest = mobservermap.newest(); if (!mneweventoccurred && newest != null && mstate.compareto(newest.getvalue().mstate) > 0) { //如果大于当前state,那么就调用backwardpass方法。 forwardpass(lifecycleowner); } } mneweventoccurred = false; }
backwardpass和forwardpass的代码都会调用:
observer.dispatchevent(lifecycleowner, event)
static class observerwithstate { state mstate; lifecycleeventobserver mlifecycleobserver; observerwithstate(lifecycleobserver observer, state initialstate) { mlifecycleobserver = lifecycling.lifecycleeventobserver(observer); mstate = initialstate; } void dispatchevent(lifecycleowner owner, event event) { state newstate = event.gettargetstate(); mstate = min(mstate, newstate); mlifecycleobserver.onstatechanged(owner, event); mstate = newstate; } }
调用了lifecycling.getcallback方法来获得mlifecycleobserver的实例,通过这个实例调用onstatechanged:
static lifecycleeventobserver lifecycleeventobserver(object object) { boolean islifecycleeventobserver = object instanceof lifecycleeventobserver; boolean isfulllifecycleobserver = object instanceof fulllifecycleobserver; if (islifecycleeventobserver && isfulllifecycleobserver) { return new fulllifecycleobserveradapter((fulllifecycleobserver) object, (lifecycleeventobserver) object); } if (isfulllifecycleobserver) { return new fulllifecycleobserveradapter((fulllifecycleobserver) object, null); } if (islifecycleeventobserver) { return (lifecycleeventobserver) object; } //通过反射,找到lifecycle 自动生成的类 final class<?> klass = object.getclass(); int type = getobserverconstructortype(klass); if (type == generated_callback) { list<constructor<? extends generatedadapter>> constructors = sclasstoadapters.get(klass); if (constructors.size() == 1) { generatedadapter generatedadapter = creategeneratedadapter( constructors.get(0), object); 最终使用生成的adapter,创建singlegeneratedadapterobserver return new singlegeneratedadapterobserver(generatedadapter); } generatedadapter[] adapters = new generatedadapter[constructors.size()]; for (int i = 0; i < constructors.size(); i++) { adapters[i] = creategeneratedadapter(constructors.get(i), object); } return new compositegeneratedadaptersobserver(adapters); } return new reflectivegenericlifecycleobserver(object); }
class singlegeneratedadapterobserver implements lifecycleeventobserver { private final generatedadapter mgeneratedadapter; singlegeneratedadapterobserver(generatedadapter generatedadapter) { mgeneratedadapter = generatedadapter; } @override public void onstatechanged(@nonnull lifecycleowner source, @nonnull lifecycle.event event) { mgeneratedadapter.callmethods(source, event, false, null); mgeneratedadapter.callmethods(source, event, true, null); } }
到这里会根据依赖中添加的annotationprocessor “androidx.lifecycle:lifecycle-compiler:2.2.0″根据不同生命周期注解生成不同的类,整个过程还是比较复杂的。整体过程如下图:
总结
到此这篇关于android中lifecycle的原理详解的文章就介绍到这了,更多相关android lifecycle原理内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!