Android架构灵魂组件Lifecycle的生命周期机制详解_android lifecycleobserver(1)

mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}

void performStart() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}

void performResume() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
}

void performPause() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
}

void performStop() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
}

void performDestroy() {
mChildFragmentManager.dispatchDestroy();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
//······
}
}

我们注册 Lifecycle 的时候,实际上都注册到 LifecycleRegistry 里面去了。通过 handleLifecycleEvent() 分发自己的状态到每个观察者,从而实现观察生命周期实现变化的能力。看起来简单实际上 Lifecycle 在分发生命周期的时候并不简单,所有逻辑重点都在 LifecycleRegistry。

Fragment 是如何派发生命周期的?也就是它会在自己生命周期里面,让 LifecycleRegistry 去分发生命周期事件,给每一个观察者。但是 Activity 中并不是这么做的。

2.Activity是如何是实现Lifecycle的

Activity 实现 Lifecycle 的核心源码,需要来到 ComponentActivity 里面,同样也是实现了 LifecycleOwner 接口:

public class ComponentActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

//复写getLifecycle(),返回LifecycleRegistry对象
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//往Activity上添加一个fragment,用以报告生命周期的变化
//目的是为了兼顾不是继承自AppCompactActivity的场景
ReportFragment.injectIfNeededIn(this);
}
}

与上面 Fragment 的实现类似,它实现了 LifecycleOwner,表示一个生命周期的宿主,必须实现 getLifecycle() 方法,返回一个 Lifecycle,也就是 LifecycleRegistry。

但是在 ComponentActivity 里面并没有在它的每个生命周期方法里面把它的状态分发给一个观察者,但是在 onCreate() 方法里面调用 ReportFragment.injectIfNeededIn(this) 这种做法实际上是往自己里面添加了一个不可见的 Fragment,专门用于报告分发给每个观察者。

public class ReportFragment extends Fragment {
public static void injectIfNeededIn (Activity activity) {
if (Build.VERSION.SDK_INT >= 29) {
// API 29 以上可以直接注册正确的生命周期回调
activity.registerActivityLifecycleCallbacks(
new LifecycleCallbacks ()
);
}
// 兼容API 29之前的,需要支持直接继承Activity的,使用Fragment来正确获得生命周期事件
android.app.FragmentManager manager = activity . getFragmentManager ();
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new ReportFragment (), REPORT_FRAGMENT_TAG).commit();
manager.executePendingTransactions();
}
}
}

所以 Activity 事件的分发是依靠 ReportFragment 来完成的。

  • API 29 以下: 主要是通过 ReportFragment 将自身添加到 Activity 中实现。
  • API 29 及以上:Activity 中增加一组 ActivityLifecycleCallbacks 的相关方法,可以直接通过注册 ActivityLifecycleCallbacks 观察生命周期。

ComponentActivity 为什么这么做而不直接在 Activity 内部直接分发呢?主要是为了兼顾不是继承自 AppCompatActivity 的场景。有可能是直接继承自 Activity,然后自己实现了 Lifecycle 接口。

public class ReportFragment extends Fragment {
// 增加dispatch重载,尝试获取Activity中的LifecycleRegistry并调用 handleLifecycleEvent
static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) {
if (activity instanceof LifecycleRegistryOwner) {
((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
return;
}

if (activity instanceof LifecycleOwner) {
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
// 2.各个生命周期方法里面都调用了dispatch()方法
@Override
public void onStart() {
super.onSt

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值