Android生命周期组件Lifecycle使用详解,可能是全网最细的Android-资源加载机制剖析

}

如果我们把很多这种需要跟生命周期相关的逻辑代码都直接放在 Activity 的生命周期方法中,Activity 将会变得难以维护。通过 Lifecycle,我们就能避免这种问题。因为本质上我们需要的只是 Activity 或者 Fragment 的生命周期发生改变的时候能通知到我们,以便我们在对应生命周期中执行对应的方法。

Lifecycle 的基本使用

2.0、 导入 Lifecycle 依赖

Lifecycle 被包含在 support library 26.1.0 及之后的依赖包中,如果我们的项目依赖的支持库版本在 26.1.0及以上,那么不需要额外导入 Lifecycle 库,本篇例子中使用的支持库是 28.0.0 :

implementation ‘com.android.support:appcompat-v7:28.0.0’

如果支持库版本小于 26.1.0 ,就需要单独导入 Lifecycle 库 :

implementation “android.arch.lifecycle:runtime:1.1.1”

当然,如果项目已经迁移到了 AndroidX,可以使用下面的方式引入 :

implementation “androidx.lifecycle:lifecycle-runtime:2.0.0”

还是建议大家尝试尽快把项目迁移为AndroidX,因为很多更新,会最先在 AndroidX 中发布,逐渐摆脱传统的support包。比如这里要讲的 Lifecycle 在 AndroidX 中已经升级到了 2.x 版本,而支持库中还是 1.x 版本。

鉴于支持库一般都在 26.1.0 以上,并且尚有大部分用户未迁移到AndroidX,在本篇文章中,我们使用 support library 28.0.0 中默认包含的 Lifecycle 库。我们在项目的 app 目录下的 build.gradle 文件中添加以下依赖:

implementation ‘com.android.support:appcompat-v7:28.0.0’

以 support library 版本在 26.1.0 及以上为前提,这里我们分两种情况来讲。一种是我们创建的Activity 继承自 AppCompatActivity(以Activity 为例,Fragment类似),另一种是创建的 Activity 继承自普通的 Activity,而非 AppCompatActivity。

这里要先说一点, Lifecycle 的实现机制是观察者模式,整体上知道了这个,再讲它的使用过程就比较容易理解了:
1. 构建一个 Lifecycle 对象(通过一个实现了 LifecycleOwner 接口的对象的 getLifecycle()方法返回),这个对象就是一个被观察者,具有生命周期感知能力
2. 构建一个 LifecycleObserver 对象,它对指定的 Lifecycle 对象进行监听
3. 通过将 Lifecycle 对象的 addObserver(…) 方法,将 Lifecycle 对象和 LifecycleObserver 对象进行绑定

2.1、 继承自 AppCompatActivity

首先,我们创建一个 MyObserver.java 类,让它实现 LifecycleObserver 接口( LifecycleObserver 接口是一个空接口,主要是给注解处理器使用),如下:

public class MyObserver implements LifecycleObserver {

private static final String TAG = “MyObserver”;

// 使用注解 @OnLifecycleEvent 来表明该方法需要监听指定的生命周期事件
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
// …
Log.d(TAG, “connectListener: -------- onResume” );
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {
// …
Log.d(TAG, “disconnectListener: ------- onPause”);
}
}

可以看到,我们通过在方法上使用@OnLifecycleEvent 注解使得该方法具有了生命周期感知能力。括号里面的参数,表明需要监听的是什么生命周期事件。Lifecycle 主要就是通过 EventState 这两个枚举类来跟踪所关联组件的生命周期状态。具体的 Event 和 State 之间的转换关系,可以参照下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,让我们的 Activity 继承自 AppCompatActivity,然后在 onCreate(…) 方法中通过getLifecycle().addObserver(new MyObserver())完成 Lifecycle 和LifecycleObserver 的绑定。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 就只需要这一行代码,简洁吧
getLifecycle().addObserver(new MyObserver());
}
}

然后我们就可以运行下程序,切换到 Home 也或者按返回键,就能看到随着生命周期的变化,MyObserver() 中定义的方法在控制台中也被正确地打印了出来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是不是觉得特别简单。

但之所以毫不费力,是因为有人替你“负重前行”。在 support library 26.1.0 及以后的支持库中,AppCompatActivity 的祖先类 SupportActivity已经默认实现了 LifecycleOwner 接口,通过其 getLifecycle() 方法可以直接返回一个 Lifecycle 对象。之后我们就可以通过该对象的 addObserver(…) 方法将 Lifecycle 跟指定的 LifecycleObserver 进行绑定。

2.2、 继承自普通的 Activity

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)
img

最后我还整理了很多Android中高级的PDF技术文档。以及一些大厂面试真题解析文档。

image

Android高级架构师之路很漫长,一起共勉吧!

最后我还整理了很多Android中高级的PDF技术文档。以及一些大厂面试真题解析文档。

[外链图片转存中…(img-wZs4yifo-1711553523572)]

Android高级架构师之路很漫长,一起共勉吧!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 40
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,使用`lifecycle`库可以更方便地管理`fragment`的生命周期。通过`lifecycle`库,我们可以将`fragment`的生命周期与宿主`Activity`的生命周期进行绑定,这样就可以在`Activity`的生命周期发生变化时,自动调用`fragment`的对应生命周期方法,从而更好地管理`fragment`的状态。 具体来说,我们可以通过以下步骤来使用`lifecycle`库进行`fragment`的生命周期管理: 1. 在`build.gradle`文件中添加`lifecycle`库的依赖: ``` implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' ``` 2. 在`fragment`中实现`LifecycleOwner`接口,并将`getLifecycle()`方法返回`Lifecycle`对象: ``` public class MyFragment extends Fragment implements LifecycleOwner { private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); @NonNull @Override public Lifecycle getLifecycle() { return mLifecycleRegistry; } // ... } ``` 3. 在`fragment`中使用`LifecycleRegistry`对象来管理生命周期状态的变化: ``` public class MyFragment extends Fragment implements LifecycleOwner { private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); } @Override public void onStart() { super.onStart(); mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); } @Override public void onResume() { super.onResume(); mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME); } // ... @Override public void onDestroy() { super.onDestroy(); mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY); } } ``` 通过这样的方式,我们就可以更方便地管理`fragment`的生命周期,避免出现一些生命周期相关的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值