关于android:Activity是如何实现LifecycleOwner的

6次阅读

共计 4223 个字符,预计需要花费 11 分钟才能阅读完成。

咱们都晓得 Activity 可作为 LifecycleOwnerLiveData的应用提供条件,那么 Activity 是如何实现 LifecycleOwner 的呢?

Activity 尽管实现了 LifecycleOwner 接口,然而并没有实现相干解决,而是通过增加一个 Fragment 来代理 Lifecycle 的散发。这种通过 Fragment 代理 Activity 行为的设计在其余一些库也经常出现,相对来说更加无侵和优雅。

SupportActivity

Activity 通过继承 SupportActivity 实现 LifecycleOwner 接口。留神在 AndroidX 中 SupportActivity 改名为ComponentActivity

public class SupportActivity extends Activity implements LifecycleOwner {

    ...

    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    ...

    @Override
    protected void onSaveInstanceState(Bundle outState) {mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        super.onSaveInstanceState(outState);
    }

    ...

    @Override
    public Lifecycle getLifecycle() {return mLifecycleRegistry;}
}

SupportActivity申明了 mLifecycleRegistry 对象,然而没有间接应用其进行生命周期的散发,而是被 ReportFragment 通过 activity.getLifecycle() 获取应用。

ReportFragment

SupportActivityonCreate 为本人增加了ReportFragment

@RestrictTo(LIBRARY_GROUP)
public class SupportActivity extends Activity implements LifecycleOwner {
  // ...

  @Override
  @SuppressWarnings("RestrictedApi")
  protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);
      ReportFragment.injectIfNeededIn(this);
  }

  // ...
}

低版本 Activity 兼容 Lifecycle

SupportActivity是随同 Lifecycle 才呈现的,android.arch.lifecycle:extensions为晚期还没有继承 SupportActivity 的 Activity 也提供了反对,通过 LifecycleDispatcher 实现 ReportFragment 的注入:

class LifecycleDispatcher {static void init(Context context) {if (sInitialized.getAndSet(true)) {return;}
        ((Application) context.getApplicationContext())
                .registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
    }

    static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {
        private final FragmentCallback mFragmentCallback;

        DispatcherActivityCallback() {mFragmentCallback = new FragmentCallback();
        }

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {if (activity instanceof FragmentActivity) {((FragmentActivity) activity).getSupportFragmentManager()
                        .registerFragmentLifecycleCallbacks(mFragmentCallback, true);
            }
            ReportFragment.injectIfNeededIn(activity);
        }

    }
}

之前还纳闷为什么 ReportFragment 的实现不写到 SupportActivity 中去,看到这里终于了解了其存在的意义了吧。

LifecycleDispatcher并不需要在 Application 中调用,他通过 ContentProvider 实现初始化

public class ProcessLifecycleOwnerInitializer extends ContentProvider {
    @Override
    public boolean onCreate() {LifecycleDispatcher.init(getContext());
        ProcessLifecycleOwner.init(getContext());
        return true;
    }    
}

android.arch.lifecycle:extensionsaarAndroid Manifest中注册:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.arch.lifecycle.extensions" >

    <uses-sdk android:minSdkVersion="14" />

    <application>
        <provider
            android:name="android.arch.lifecycle.ProcessLifecycleOwnerInitializer"
            android:authorities="${applicationId}.lifecycle-trojan"
            android:exported="false"
            android:multiprocess="true" />
    </application>

</manifest>

${applicationId}占位符,防止 authroities 抵触。

可见在无侵这件事件上做到了极致,这种无侵的初始化办法十分值得咱们借鉴和应用。

两种 Fragment

通过下面剖析,咱们晓得 Activity 是通过 ReportFragment 代理了 LifecycleOwner 的实现。那么在 Activity 中增加的 LifecycleOwner 与 Activity 的 Fragment 的生命周期是否统一呢?答案是否定的

Android 中存在两种 Fragment 有两种:

  • ADK 自带的android.app.Fragment
  • Support 包中的android.support.v4.app.Fragment(AndroidX 也归为此类)

因为前者曾经被@Deprecated,所以当初广泛应用的是后者,也就是 Support 或者 AndroidX 的 Fragment。而出于低版本兼容性的思考,ReportFragment 是前者。

Activity 对于两种 Fragment 生命周期回调的理论并不相同,以 onResume 和 onStart 为例,Activity 回调的理论如下表:

下面表格中 () 中的数字示意顺次执行的程序,所以你会发现,sdk fragmentonStart 晚于 support fragment,而onResume 却更早执行

Activity 的 LifecycleOwner 尽管是基于 Fragment 实现的,然而同一个 Activity 的 LifecycleOwner 与 Fragment 的生命周期回调理论并不统一。

这在咱们的开发重要特备留神,不要视图让 Fragment 和 LifecycleOwner 的生命周期中的解决产生时序上的依赖关系。

总结

* 通过源码剖析 Activity 对于 LifecycleOwner 的实现后,咱们失去以下论断

  • Activity 不间接调用 HandleLifecycleEvent 进行生命周期的散发,而是通过 ReportFragment 实现
  • ReportFragment 的注入和过程全程无侵,值得咱们借鉴和学习
  • 同一个 Activity,其 LifecycleOwner 与 Fragment 的生命周期回调理论并不统一,须要特地留神

Android 高级开发零碎进阶笔记、最新面试温习笔记 PDF,我的 GitHub

文末

您的点赞珍藏就是对我最大的激励!
欢送关注我,分享 Android 干货,交换 Android 技术。
对文章有何见解,或者有何技术问题,欢送在评论区一起留言探讨!

正文完
 0