写点什么

jetpack--Lifecycle 扩展,Android 入门

作者:嘟嘟侠客
  • 2021 年 11 月 28 日
  • 本文字数:3626 字

    阅读完需:约 12 分钟

postDispatchRunnable(Lifecycle.Event.ON_CREATE);}


//service onBind onServicePreSuperOnBind 分发 ON_START 事件,在 service 调用 super.OnBind 之前 public void onServicePreSuperOnBind() {postDispatchRunnable(Lifecycle.Event.ON_START);}


//service onStart/onStartCommand onServicePreSuperOnStart 分发 ON_START 事件,在 service 调用 super.OnStart 之前 public void onServicePreSuperOnStart() {postDispatchRunnable(Lifecycle.Event.ON_START);}


//service onDestroy onServicePreSuperOnDestroy 分发 ON_STOP/ON_DESTROY 事件,在 service 调用 super.OnDestroy 之前 public void onServicePreSuperOnDestroy() {postDispatchRunnable(Lifecycle.Event.ON_STOP);postDispatchRunnable(Lifecycle.Event.ON_DESTROY);}


/**


  • @return {@link Lifecycle} for the given {@link LifecycleOwner}*/@NonNullpublic Lifecycle getLifecycle() {return mRegistry;}


static class DispatchRunnable implements Runnable {private final LifecycleRegistry mRegistry;final Lifecycle.Event mEvent;private boolean mWasExecuted = false;


DispatchRunnable(@NonNull LifecycleRegistry registry, Lifecycle.Event event) {mRegistry = registry;mEvent = event;}


@Overridepublic void run() {if (!mWasExecuted) {mRegistry.handleLifecycleEvent(mEvent);mWasExecuted = true;}}}}

小结

LifeCycleService 借助 ServiceLifecycleDispatcher 来进行 LifeCycle 的获取和 事件分发。


Service.OnCreate 中会触发 分发 ON_CTEATE 事件


Service.OnStart/onStartCommand/OnBind 中会触发 分发 ON_START 事件


Service.onDestroy 会触发 分发 ON_STOP 、ON_DESTROY 事件



二、ProcessLifecycleOwner

public class ProcessLifecycleOwner implements LifecycleOwner {


@VisibleForTestingstatic final long TIMEOUT_MS = 700; //mls


//记录 start 的 activity 的数量 private int mStartedCounter = 0;//记录 resume 的 activity 的数量 private int mResumedCounter = 0;//是否发送了 应用 pause 事件 private boolean mPauseSent = true;//是否发送了应用 Stop 事件 private boolean mStopSent = true;


private Handler mHandler;


private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);//事件分发任务 private Runnable mDelayedPauseRunnable = new Runnable() {@Overridepublic void run() {dispatchPauseIfNeeded();dispatchStopIfNeeded();}};//activity 初始化监听 只监听了 onCreate onStart onResumeActivityInitializationListener mInitializationListener =new ActivityInitializationListener() {@Overridepublic void onCreate() {}


@Overridepublic void onStart() {activityStarted();}


@Overridepublic void onResume() {activityResumed();}};//单例实现方式 private static final ProcessLifecycleOwner sInstance = new ProcessLifecycleOwner();


//返回单例 @NonNullpublic static LifecycleOwner get() {return sInstance;}//关联 context,初始化 static void init(Context context) {sInstance.attach(context);}//分发应用 ON_START 事件 start 的 activity 数量等于 1 且 且 mStopSent 是 truevoid activityStarted() {mStartedCounter++;if (mStartedCounter == 1 && mStopSent) {mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);mStopSent = false;}}


//分发应用 ON_RESUME 事件 resume 的 activity 数量等于 1 且 且 mPanseSent 是 true,如果 mPauseSent 不为 true,移除即将要发送的 mDelayedPauseRunnablevoid activityResumed() {mResumedCounter++;if (mResumedCounter == 1) {if (mPauseSent) {mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);mPauseSent = false;} else {mHandler.removeCallbacks(mDelayedPauseRunnable);}}}


//mResumedCounter 等于 0 的时候 延时 700 ms 触发 mDelayedPauseRunnable 任务 void activityPaused() {mResumedCounter--;if (mResumedCounter == 0) {mHandler.postDelayed(mDelayedPauseRunnable, TIMEOUT_MS);}}//stop 时 void activityStopped() {mStartedCounter--;dispatchStopIfNeeded();}//如果 mResumedCounter == 0 分发 ON_PAUSE 事件 void dispatchPauseIfNeeded() {if (mResumedCounter == 0) {mPauseSent = true;mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);}}//如果 mStartedCounter == 0 且发送了 onpause 则分发 ON_STOP 事件 void dispatchStopIfNeeded() {if (mStartedCounter == 0 && mPauseSent) {mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);mStopSent = true;}}//私有构造函数 private ProcessLifecycleOwner() {}//attach 会触发 分发 onCreate 事件,并在 api >= 29 时通过 activity.registerActivityLifecycleCallbacks 时 感知 acitivity 生命周期,<29 时 通过 setProcessListener(mInitializationListene


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


r) 来感知 void attach(Context context) {mHandler = new Handler();mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);Application app = (Application) context.getApplicationContext();app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {@Overridepublic void onActivityPreCreated(@NonNull Activity activity,@Nullable Bundle savedInstanceState) {activity.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {@Overridepublic void onActivityPostStarted(@NonNull Activity activity) {activityStarted();}


@Overridepublic void onActivityPostResumed(@NonNull Activity activity) {activityResumed();}});}


@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {


if (Build.VERSION.SDK_INT < 29) {ReportFragment.get(activity).setProcessListener(mInitializationListener);}}


@Overridepublic void onActivityPaused(Activity activity) {activityPaused();}


@Overridepublic void onActivityStopped(Activity activity) {activityStopped();}});}


@NonNull@Overridepublic Lifecycle getLifecycle() {return mRegistry;}}


//ReportFragment 会先进行 mProcessListener 的分发 ,然后进行 ON_CREATE 分发 @Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);dispatchCreate(mProcessListener);dispatch(Lifecycle.Event.ON_CREATE);}//activity 会先进行 dispatchActivityPreCreated 分发,然后是 fragment 的 dispatchActivityCreated,然后是 activity 的 onCreate@UnsupportedAppUsagefinal void performCreate(Bundle icicle, PersistableBundle persistentState) {dispatchActivityPreCreated(icicle);//省略代码 mFragments.dispatchActivityCreated();dispatchActivityPostCreated(icicle);}


小结


1.ProcessLifecycleOwner 会在 attach 时触发 ON_CREATE 事件


2.ProcessLifecycleOwner 会 在 API >= 29 onActivityPreCreated 时 向 activity 注入 EmptyActivityLifecycleCallbacks 用于在 activity 的 onCreate、onStart、onResume 之前提前 application 可以提前知道 生命周期;API < 29 时会通过 ReportFragment.get(activity).setProcessListener(mInitializationListener) 来提前感知 onCreate、onStart、onResume 生命周期(提前是相对于 activity 的 onCreate/onStart/onResume 回调)。

学习宝典

对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。


不论遇到什么困难,都不应该成为我们放弃的理由!


很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对 Android 程序员,我这边给大家整理了一套学习宝典!包括不限于高级 UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter 等全方面的 Android 进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!


【Android 核心高级技术 PDF 文档,BAT 大厂面试真题解析】



【算法合集】



【延伸 Android 必备知识点】



【Android 部分高级架构视频学习资源】


本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
jetpack--Lifecycle 扩展,Android入门