专栏名称: 刘望舒
腾讯云最具价值专家
目录
相关文章推荐
复利大王  ·  冷暴力女王,翻车了 ·  8 小时前  
复利大王  ·  00后新观念!与男朋友保持非婚姻长期关系 ·  8 小时前  
复利大王  ·  手握25w华子股票,躺平了 ·  8 小时前  
复利大王  ·  北大软微男在女厕所偷拍! ·  2 天前  
51好读  ›  专栏  ›  刘望舒

Android Jetpack架构组件(三)一文带你了解Lifecycle(原理篇)

刘望舒  · 掘金  · android  · 2019-10-25 04:23

正文

请到「今天看啥」查看全文


Activity implements LifecycleOwner { private SimpleArrayMap<Class<? extends ExtraData>, ExtraData> mExtraDataMap = new SimpleArrayMap<>(); private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry( this ); //1 @RestrictTo (LIBRARY_GROUP) public void putExtraData (ExtraData extraData) { mExtraDataMap.put(extraData.getClass(), extraData); } @Override @SuppressWarnings ( "RestrictedApi" ) protected void onCreate (@Nullable Bundle savedInstanceState) { super .onCreate(savedInstanceState); ReportFragment.injectIfNeededIn( this ); //2 } @CallSuper @Override protected void onSaveInstanceState (Bundle outState) { mLifecycleRegistry.markState(Lifecycle.State.CREATED); //3 super .onSaveInstanceState(outState); } @RestrictTo (LIBRARY_GROUP) public <T extends ExtraData> T getExtraData (Class<T> extraDataClass) { return (T) mExtraDataMap.get(extraDataClass); } @Override public Lifecycle getLifecycle () { return mLifecycleRegistry; //4 } @RestrictTo (LIBRARY_GROUP) public static class ExtraData { } } 复制代码

注释1处创建了LifecycleRegistry,它是Lifecycle的实现类。注释4处实现了LifecycleOwner接口定义的getLifecycle方法,返回了LifecycleRegistry。在注释3处,将Lifecycle的State设置为CREATED。正常来说应该在ComponentActivity的各个生命周期方法中改变Lifecycle的State,显然在ComponentActivity中没有做这些,而是将这个任务交给了ReportFragment,注释2处的将ComponentActivity注入到ReportFragment中。

frameworks/support/lifecycle/runtime/src/main/java/androidx/lifecycle/ReportFragment.java

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class ReportFragment extends Fragment {
    private static final String REPORT_FRAGMENT_TAG = "androidx.lifecycle"
            + ".LifecycleDispatcher.report_fragment_tag";
    public static void injectIfNeededIn(Activity activity) {
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            manager.executePendingTransactions();
        }
    }
    static ReportFragment get(Activity activity) {
        return (ReportFragment) activity.getFragmentManager().findFragmentByTag(
                REPORT_FRAGMENT_TAG);
    }
   ...
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);
    }

    @Override
    public void onStart() {
        super.onStart();
        dispatchStart(mProcessListener);
        dispatch(Lifecycle.Event.ON_START);//1
    }

    @Override
    public void onResume() {
        super.onResume();
        dispatchResume(mProcessListener);
        dispatch(Lifecycle.Event.ON_RESUME);
    }

  ...
    private void dispatch(Lifecycle.Event event) {
        Activity activity = getActivity();
        if (activity instanceof LifecycleRegistryOwner) {//2
            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
            return;
        }

        if






请到「今天看啥」查看全文


推荐文章
复利大王  ·  冷暴力女王,翻车了
8 小时前
复利大王  ·  手握25w华子股票,躺平了
8 小时前
复利大王  ·  北大软微男在女厕所偷拍!
2 天前
青年电影手册  ·  手册声明 | 对于盗版,我们零容忍!
8 年前
创意铺子  ·  世界上最不能等的事……
8 年前
医学影像人  ·  【医学影像每日一例】心包病变
7 年前
企业管理杂志  ·  学技艺更要学品行
7 年前