public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
@Override
public void onStart() {
super.onStart();
mLifecycleRegistry.markState(Lifecycle.State.STARTED);
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
生命周期感知组件的最佳实践
保持UI控制器(activities和fragments)尽可能轻量级。他们不应该试图获取他们自己的数据;相反,使用ViewModel来做这件事,并观察LiveData对象,以将数据变化返回给视图。
尝试编写数据驱动的UI,其中UI控制器的职责是在数据更改时更新视图,或将用户操作通知回ViewModel。
将你的数据逻辑放在ViewModel类中。ViewModel应充当UI控制器和应用程序其余部分之间的连接器。但是要注意,ViewModel的责任不是用来获取数据(例如,从一个网络获取数据)。相反,ViewModel应该调用适当的组件来获取数据,然后将结果提供给UI控制器。
使用Data Binding来维护View和UI控制器之间的干净接口。这可以让您的视图更具声明性,并最小化您需要在activities和fragments中写入的更新代码。如果你习惯用Java编程语言做这件事,使用像Butter Knife这样的库来避免样板代码并有更好的抽象。
如果UI复杂,请考虑创建一个presenter类来处理UI修改。这可能是一项费力的任务,但它可以使UI组件更容易测试。
避免在ViewModel中引用View或者Activity的上下文。如果ViewModel超出了activity(在配置改变的情况下),那么您的activity就会内存泄漏,并且不能被垃圾收集器正确地处理。
生命周期感知组件的使用场景
生命周期感知组件可以使您在各种情况下更容易管理生命周期。举几个例子:
在粗粒度和细粒度位置更新之间切换。使用生命周期感知的组件,使细粒度的位置更新,而您的位置应用程序是可见的,并切换到粗粒度更新时,应用程序是在后台。LiveData是一个生命周期感知组件,允许你的app自动更新UI,在用户更改位置的时候。
停止和启动视频缓冲。使用生命周期感知的组件尽快启动视频缓冲,但推迟播放直到应用程序完全启动。当应用程序被销毁时,还可以使用生命周期感知组件来终止缓冲。
启动和停止网络连接。当应用程序处于前台,使用生命周期感知的组件来启用网络数据的实时更新(流),并且当应用程序进入后台时也会自动暂停。
停止和恢复动画drawables。当应用程序处于后台时,使用生命周期感知的组件来停止动画,当应用程序处于前台之后恢复动画播放。
停止事件处理
当Lifecycle属于AppCompatActivity或Fragment时,生命周期的状态将更改为CREATED,而当AppCompatActivity或Fragment的onSaveInstanceState()被调用时,ON_STOP事件将被调度。
当通过onSaveInstanceState()保存Fragment或AppCompatActivity的状态时,其UI被认为是不可变的,直到调用ON_START。试图在保存状态后修改UI可能会导致应用程序导航状态的不一致,这是为什么如果在保存状态后应用程序运行FragmentTransaction,则FragmentManager抛出异常。有关详细信息,请参阅commit()。
LiveData阻止了它的边缘情况,通过阻止调用observer,如果observer关联的Lifecycle不是在STARTED状态。在幕后,它调用isAtLeast(),然后决定调用它的observer。
不幸的是,AppCompatActivity的onStop()方法是在onSaveInstanceState()之后调用的,它留下了一个不允许UI状态改变的间隙,但是Lifecycle还没有被移动到创建的状态。
为了防止这种情况,BETA2版本以及更低版本标记这个状态为CREATED,并且没有分发这个事件,以至于任何代码段检查当前的状态来获取真正的值,尽管事件在 onStop()被调用的时候 才会被分发。
不幸的是,这个解决方案有两个主要问题:
在API级别23和更低的情况下,Android系统实际上保存了活动的状态,即使它被另一个activity部分覆盖。换句话说,Android系统调用onSaveInstanceState(),但它不一定调用onStop()。这就形成了一个潜在的长间隔,以至于观察者仍然认为生命周期是活动的,而此时它的UI状态不能被修改。
任何想要向LiveData类暴露类似行为的类都必须实现Lifecycle Beta2版本或者更低版本提供的解决方案。
注意: 为了使流程更简单,并与旧版本提供更好的兼容性,从版本1.0.0 RC1开始,Lifecycle对象被标记为CREATED,当onSaveInstanceState()被调用时, ON_STOP事件被分发,而不需等待调用onStop()方法。这不太可能影响您的代码,但这里你需要注意,因为它与API级别26和更低的Activity类中的调用顺序不匹配。
尝试lifecycle 组件 codelab.
生命周期感知组件是Android Jetpack的一部分。在Sunflower演示应用程序中可以看到他们。
使用生命周期感知组件处理生命周期LifecycleEventStateLifecycleOwner实现一个自定义的LifecycleOwner生命周期感知组件的最佳实践生命周期感知组件的使用场景停止事件处理附加资源使用生命周期感知组件处理生命周期生命周期感知组件响应于另一组件的生命周期状态(如Activity和Fragment)的变化而执行动作。这些组件...
Android_Jetpack:LifeCycle在Activity/Fragment、Service以及Application中的应用一、使用LifeCycle解耦Activity/Fragment与组件二、使用LifeCycleService解耦Service与组件三、使用ProcessLifecycleOwner监听应用程序的生命周期
最近重新捡起了Android开发,对Jetpack很感兴趣,就专门研究了下。这篇主要讲的就是系统组件与普通组件解耦的LifeCycle。LifeCycle可以帮助开发者
你真的了解lifecycle吗?本文的目标就是要“打破砂锅问到底”,带你真真切切了解它。lifecycle 是属于Android Jetpack(官方开发工具包)—— Architecture(架构组件)中的一员。
【官方介绍】构建生命周期感知型组件,这些组件可以根据 Activity 或 Fragment 的当前生命周期状态调整行为。
【白话】lifecycle可以和Activity或Fragment生命周期绑定,方便我们做一些跟生命周期相关的业务逻辑。
【应用场景】【示例】为了方便李(理)姐(解),下
本篇文章我们将来学习 Android Jetpack 架构组件中的 Lifecycle 组件。Lifecycle 组件是帮忙我们管理 Activity 和Fragment 的生命周期,也就是说,当 Activity 或者 Fragment 的生命周期发生变化的时候我们可以得到通知。我们通常会在生命周期方法中调用各种方法,这就导致生命周期相关方法代码比较臃肿,且耦合性高,不易维护。
1. 为什么需要Lifecycle
在应用开发中,处理 Activity 或者 Fragment 组件的生命周期相关代码是