共计 4223 个字符,预计需要花费 11 分钟才能阅读完成。
咱们都晓得 Activity 可作为 LifecycleOwner
为LiveData
的应用提供条件,那么 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
SupportActivity
在 onCreate
为本人增加了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:extensionsaar
的Android
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 fragment
的 onStart
晚于 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 技术。
对文章有何见解,或者有何技术问题,欢送在评论区一起留言探讨!