jetpack--Lifecycle 扩展

1,074 阅读3分钟

前言

生命周期持有者除了Activity、fragment还有 service 和 application ,本文讲述 LifeCycleService 和 ProccessLifeCycleOwner

一、LifeCycleService

public class LifecycleService extends Service implements LifecycleOwner {
    //可以理解为事件分发工具类,辅助进行 service 的事件分发
    private final ServiceLifecycleDispatcher mDispatcher = new ServiceLifecycleDispatcher(this);

    //Oncreate 会触发事件分发---调用mDispatcher.onServicePreSuperOnCreate()
    @CallSuper
    @Override
    public void onCreate() {
        mDispatcher.onServicePreSuperOnCreate();
        super.onCreate();
    }
    
    @CallSuper
    @Nullable
    @Override
    //OnBind 会触发事件分发---调用mDispatcher.onServicePreSuperOnBind()
    public IBinder onBind(@NonNull Intent intent) {
        mDispatcher.onServicePreSuperOnBind();
        return null;
    }

    @SuppressWarnings("deprecation")
    @CallSuper
    @Override
    //OnBind 会触发事件分发---调用mDispatcher.onServicePreSuperOnStart()
    public void onStart(@Nullable Intent intent, int startId) {
        mDispatcher.onServicePreSuperOnStart();
        super.onStart(intent, startId);
    }

    //这里没有事件分发 因为内部调用了 onStart 
    @CallSuper
    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
    
    @CallSuper
    @Override
    //OnBind 会触发事件分发---调用mDispatcher.onServicePreSuperOnDestroy()
    public void onDestroy() {
        mDispatcher.onServicePreSuperOnDestroy();
        super.onDestroy();
    }

    @Override
    @NonNull
    //实现lifeCycleOwner 的 getLifeCycle 接口
    public Lifecycle getLifecycle() {
        return mDispatcher.getLifecycle();
    }
}
可以看到 LifecycleService 实现了 lifeCycleOwner 接口,作为生命周期持有者,生命周期的分发和 返回 LifeCycle 是借助于 ServiceLifecycleDispatcher 来实现的,而 ServiceLifecycleDispatcher 是一开始就初始化好的;

我们可以看到分别会在 onCreate/onStart/onBind/onDestroy 中触发 事件分发,那到底分发了哪些事件呢?我们来看ServiceLifecycleDispatcher

public class ServiceLifecycleDispatcher {
    //维护Observer 和 event
    private final LifecycleRegistry mRegistry;
    // 辅助进行 事件分发
    private final Handler mHandler;
    //分发任务
    private DispatchRunnable mLastDispatchRunnable;

    /**
     * @param provider {@link LifecycleOwner} for a service, usually it is a service itself
     */
    public ServiceLifecycleDispatcher(@NonNull LifecycleOwner provider) {
        mRegistry = new LifecycleRegistry(provider);
        mHandler = new Handler();
    }

    private void postDispatchRunnable(Lifecycle.Event event) {
        if (mLastDispatchRunnable != null) {
            mLastDispatchRunnable.run();
        }
        mLastDispatchRunnable = new DispatchRunnable(mRegistry, event);
        mHandler.postAtFrontOfQueue(mLastDispatchRunnable);
    }

    //service onCreate  onServicePreSuperOnCreate 分发 ON_CREATE 事件,在service 调用super.Oncreate 之前
    public void onServicePreSuperOnCreate() {
        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}
     */
    @NonNull
    public 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;
        }

        @Override
        public 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 {

    @VisibleForTesting
    static 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() {
        @Override
        public void run() {
            dispatchPauseIfNeeded();
            dispatchStopIfNeeded();
        }
    };
    //activity 初始化监听 只监听了 onCreate onStart onResume 
    ActivityInitializationListener mInitializationListener =
            new ActivityInitializationListener() {
                @Override
                public void onCreate() {
                }

                @Override
                public void onStart() {
                    activityStarted();
                }

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

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

    //分发应用ON_RESUME 事件 resume 的 activity 数量等于1 且 且mPanseSent 是true,如果mPauseSent 不为true,移除即将要发送的 mDelayedPauseRunnable 
    void 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(mInitializationListener) 来感知
    void attach(Context context) {
        mHandler = new Handler();
        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
        Application app = (Application) context.getApplicationContext();
        app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {
            @Override
            public void onActivityPreCreated(@NonNull Activity activity,
                    @Nullable Bundle savedInstanceState) {
                activity.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {
                    @Override
                    public void onActivityPostStarted(@NonNull Activity activity) {
                        activityStarted();
                    }

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

            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                 
                if (Build.VERSION.SDK_INT < 29) {
                         ReportFragment.get(activity).setProcessListener(mInitializationListener);
                }
            }

            @Override
            public void onActivityPaused(Activity activity) {
                activityPaused();
            }

            @Override
            public void onActivityStopped(Activity activity) {
                activityStopped();
            }
        });
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mRegistry;
    }
}

  //ReportFragment 会先进行  mProcessListener 的分发 ,然后进行ON_CREATE 分发
  @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);
    }
 //activity 会先进行 dispatchActivityPreCreated 分发,然后是 fragment 的 dispatchActivityCreated,然后是 activity 的 onCreate
   @UnsupportedAppUsage
    final 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 回调)。
3.ON_START 事件的分发依赖 mStartedCounter 和 mStopSent 值
4.ON_RESUME 事件的分发依赖mResumedCounter 和 mPauseSent
5.ON_PAUSE 依赖mResumedCounter ,且会有一个 700ms 的延时,主要是为了保证屏幕旋转时不会触发此事件的分发
6.ON_STOP 依赖 mStartedCounter 且和 mPauseSent的值
7.ON_DESTROY 不会触发