Lifecycle的基本使用和原理

本文详细介绍了Android中的Lifecycle机制,包括Lifecycle的基本使用方式及其实现原理。通过具体的代码示例,展示了如何利用LifecycleOwner和LifecycleObserver接口进行Activity和Fragment的生命周期观察。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Lifecycle的基本使用

Lifecycle是Android中引入的主要用来观察和监听Activity、Fragment生命周期的一套观察者机制。

在这个机制中有两个核心类,一个是LifecycleOwner接口,该接口有一个getLifecycle()方法,实现了这个接口的类就可以作为一个被观察者,AppCompatActivity和Fragment就实现了这个接口,所以它们的生命周期就可以被观察和监听。另一个是LifecycleObserver接口,实现了这个接口的类就可以作为一个观察者。基本使用如下:

1、自定义一个观察者类

class CustomLifecycleObserver : LifecycleObserver {

	//监听onStart生命周期
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun method2() {
        Log.e("znh", "LifecycleObserver_ON_START...")
    }

	//监听onResume生命周期
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun method3() {
        Log.e("znh", "LifecycleObserver_ON_RESUME...")
    }
}

2、创建一个AppCompatActivity作为被观察者

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

		//将自定义的观察者对象添加到观察者集合中
		//通过lifecycle将观察者和被观察者关联起来
        lifecycle.addObserver(CustomLifecycleObserver())
    }

    override fun onStart() {
        super.onStart()
        Log.e("znh", "onStart...")
    }

    override fun onResume() {
        super.onResume()
        Log.e("znh", "onResume...")
    }
}

3、打开MainActivity观察生命周期方法日志打印
在这里插入图片描述
从打印的日志中可以看出,当Activity中的生命周期方法回调时,都会回调LifecycleObserver中对应的监听方法,这样就完成了对Activity生命周期的观察和监听。

二、Lifecycle的原理

LifecycleOwner接口源码如下:

@SuppressWarnings({"WeakerAccess", "unused"})
public interface LifecycleOwner {
    Lifecycle getLifecycle();
}

AppCompatActivity是ComponentActivity的子类,ComponentActivity直接实现了LifecycleOwner接口,在ComponentActivity中的getLifecycle方法中返回的是LifeCycle的子类LifecycleRegistry类型的mLifecycleRegistry对象,ComponentActivity中相关源码如下:

private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

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

观察者对ComponentActivity的观察是通过在其onCreate方法中添加一个没有界面的ReportFragment来实现的,当ReportFragment的生命周期方法被调用时,就会触发其宿主Activity的Lifecycle的生命周期事件分发方法调用。

ComponentActivity的onCreate方法:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   mSavedStateRegistryController.performRestore(savedInstanceState);
   
   //将ReportFragment注册到Activity中
   ReportFragment.injectIfNeededIn(this);
   
   if (mContentLayoutId != 0) {
       setContentView(mContentLayoutId);
   }
}

ReportFragment的injectIfNeededIn方法:

 public static void injectIfNeededIn(Activity activity) {
 		//关键代码1 
        if (Build.VERSION.SDK_INT >= 29) {
            activity.registerActivityLifecycleCallbacks(
                    new LifecycleCallbacks());
        }
 
 		//关键代码2
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            manager.executePendingTransactions();
        }
    }

在关键代码1处可知,API29以上的是通过注册一个LifecycleCallbacks来监听Activity的生命周期变化的。

在关键代码2处,创建了一个ReportFragment添加到Activity的FragmentManager中。

在ReportFragment中的生命周期回调方法中,会去分发生命周期事件,这里以onResume为例:

@Override
public void onResume() {
    super.onResume();
    dispatchResume(mProcessListener);

	//关键代码3
    dispatch(Lifecycle.Event.ON_RESUME);
}

private void dispatch(@NonNull Lifecycle.Event event) {
    if (Build.VERSION.SDK_INT < 29) {
    	//关键代码4
        dispatch(getActivity(), event);
    }
}

在关键代码3处调用了dispatch方法来分发生命周期事件,在dispatch方法中可以看出,如果在API29以上是不需要走这个流程的(因为在关键代码1处,API29以上的注册了LifecycleCallbacks监听,会走监听的流程,在监听到生命周期方法回调后,也会马上调用关键代码4处的dispatch方法),API29以下的会直接调用关键代码4处的dispatch方法,所以不管是API多少的,最终都会调用到关键代码4处重载的dispatch方法,下面看下这个方法的源码:

static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) {
    if (activity instanceof LifecycleRegistryOwner) {
        ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
        return;
    }

	//关键代码5
    if (activity instanceof LifecycleOwner) {
        Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
        if (lifecycle instanceof LifecycleRegistry) {
            ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
        }
    }
}

在关键代码5处,Activity实现了LifecycleOwner的接口,getLifecycle()方法返回的是LifecycleRegistry类型的mLifecycleRegistry对象,所以接下来会调用LifecycleRegistry的handleLifecycleEvent方法:

public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {

	//关键代码6
    State next = getStateAfter(event);
    
    //关键代码7
    moveToState(next);
}

在关键代码6处的getStateAfter方法,会根据生命周期事件获取到当前的生命周期状态,当生命周期事件是ON_CREATE或者ON_STOP时都是CREATED状态,当生命周期事件是ON_START或者ON_PAUSE时都是STARTED状态,当生命周期事件是ON_RESUME时其状态是RESUMED,当生命周期事件是ON_DESTROY时其状态是DESTROYED状态:

static State getStateAfter(Event event) {
    switch (event) {
        case ON_CREATE:
        case ON_STOP:
            return CREATED;
        case ON_START:
        case ON_PAUSE:
            return STARTED;
        case ON_RESUME:
            return RESUMED;
        case ON_DESTROY:
            return DESTROYED;
        case ON_ANY:
            break;
    }
    throw new IllegalArgumentException("Unexpected event value " + event);
}

在关键代码7处会调用moveToState方法,在moveToState方法中又会调用sync方法,在sync方法中又会去调用backwardPass方法或者forwardPass方法去同步生命周期并将当前生命周期Event事件回调给观察者。

从Lifecycle的使用中可以知道,观察者是通过getLifecycle().addObserver(LifecycleObserver observer)方法被添加到观察者集合中去的。

生命周期事件回调给观察者是通过调用观察者LifecycleObserver的子类LifecycleEventObserver的onStateChanged(owner, event)方法来实现的,在onStateChanged方法中通过反射的手段去调用观察者中有@OnLifecycleEvent注解的并跟当前生命周期相对应的方法,到这里就完成了观察者整个监听过程。

### 软件工程基本原理总结 #### 原理概述 软件工程的基本原理是由著名软件工程专家 B.W.Boehm 提出的,他认为这七条原理是确保软件产品质量开发效率的核心要素[^1]。这些原理既相互独立又构成一个完整的体系,适用于指导软件开发生命周期中的各个环节。 --- #### 七大基本原理详解 1. **用分阶段的生命周期计划严格管理** 将整个软件生命周期划分为多个阶段,并针对每一阶段制定详细的计划并严格执行。这种方法有助于合理分配资源、设定里程碑以及监控项目进展,从而降低整体风险[^3]。 2. **坚持进行阶段评审** 不仅依赖最终测试来保障质量,在每个重要阶段完成后都应当实施严格的评审流程。这样可以及时发现问题所在并加以修正,避免后期高昂的修复成本。 3. **实行严格的产品控制** 对于任何可能引起变动的因素都需要采取科学合理的管控策略——即所谓“变更控制”。尤其面对客户需求的变化时,必须保持各阶段成果之间的一致性,防止因单方面调整而导致全局混乱。 4. **采用现代程序设计技术** 积极引入最新的技术方法论到日常工作中去,不仅可以加快研发速度还能有效削减后续维护费用。例如面向对象的设计理念已被证明对于构建大规模复杂系统特别有用。 5. **结果应能清楚地审查** 明确团队成员职责范围的同时也要确立清晰可衡量的目标指标;通过这种方式可以让每一个中间产物都能够接受外界审视,进而增强透明度与可控性[^4]。 6. **开发小组的人员应少而精** 控制好队伍规模大小非常重要,因为过大的团队会增加内部沟通协调难度,反而拖慢工作效率。挑选具备高技能水平的人才组成紧凑型工作组往往能达到事半功倍的效果[^4]。 7. **承认不断改进软件工程实践的意义** 技术领域日新月异,固守陈规显然不合时宜。除了主动接纳新兴解决方案外,还需要定期回顾过往经历积累宝贵教训,并据此优化未来行动方向。具体做法包括但不限于记录周期内的各项统计数据用于分析趋势走向等[^2]。 --- 以上便是软件工程七个核心原则的具体阐述及其价值体现。遵循这些准则可以帮助我们更高效地完成高质量软件作品创作任务。 ```python # Python 示例:展示如何应用部分软件工程原理 class SoftwareProject: def __init__(self, name): self.name = name self.stages = ["Requirement Analysis", "Design", "Implementation", "Testing"] def lifecycle_management(self): """演示分阶段生命周期管理""" for stage in self.stages: print(f"Managing {stage} phase of {self.name}") project = SoftwareProject("MyApp") project.lifecycle_management() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值