Lifecycle 使用及原理解析 一文搞懂,面试突击 百度网盘

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

public void onResume() {

Log.w(TAG, "onResume: ");

}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)

public void onPause() {

Log.w(TAG, "onPause: ");

}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)

public void onStop() {

Log.w(TAG, "onStop: ");

}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)

public void onDestroy() {

Log.w(TAG, "onDestroy: ");

}

}

我们首先创建了一个类,它实现了LifecycleObserver接口,并且我写了几个模拟生命周期的方法,并在每个方法上加上了注解.

3. 观察生命周期

然后我在Activity中这样写:

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//添加一个生命周期观察者 getLifecycle()是FragmentActivity中的方法

MyObserver observer = new MyObserver();

getLifecycle().addObserver(observer);

}

}

我们将项目运行起来,观察结果:

2019-03-12 22:14:26.672 15790-15790/? W/MyObserver: onCreate:

2019-03-12 22:14:26.676 15790-15790/? W/MyObserver: onStart:

2019-03-12 22:14:26.679 15790-15790/? W/MyObserver: onResume:

2019-03-12 22:15:13.054 15790-15790/? W/MyObserver: onPause:

2019-03-12 22:15:13.234 15790-15790/? W/MyObserver: onStop:

2019-03-12 22:15:13.241 15790-15790/? W/MyObserver: onDestroy:

我们发现,不管Activity的生命周期如何变化,我创建的观察者总是能够监听到响应的生命周期变化,并且变化时还会回调我写的生命周期方法(比如:public void onDestroy()).

方不方便? 你可能会问,这有啥用? 用处大了,比如我现在Presenter中就可以很方便的监听Activity中的生命周期,从而进行一些相应的操作和处理.

二、Lifecycle原理解析


1. 从使用处入手

我们从使用的地方入手

MyObserver observer = new MyObserver();

getLifecycle().addObserver(observer);

getLifecycle()方法点进去是FragmentActivity,看注释意思是返回生命周期提供者的Lifecycle

/**

  • Returns the Lifecycle of the provider.

*/

@Override

public Lifecycle getLifecycle() {

return super.getLifecycle();

}

再跟着super.getLifecycle();进入,来到了androidx.core.app.ComponentActivity,可以看到,ComponentActivity是继承自Activity并实现了LifecycleOwner(该接口的作用是标记类有Android的生命周期的,比如Activity和Fragment)接口.

public class ComponentActivity extends Activity

implements LifecycleOwner, KeyEventDispatcher.Component {

private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

@Override

public Lifecycle getLifecycle() {

return mLifecycleRegistry;

}

}

/**

  • A class that has an Android lifecycle

*/

public interface LifecycleOwner {

@NonNull

Lifecycle getLifecycle();

}

那么其实最终是返回的LifecycleRegistry,它是Lifecycle的子类

Lifecycle是一个抽象类,里面有3个方法(添加观察者和移除观察者,获取当前的状态),还有一些状态的枚举定义.

public abstract class Lifecycle {

@MainThread

public abstract void addObserver(@NonNull LifecycleObserver observer);

@MainThread

public abstract void removeObserver(@NonNull LifecycleObserver observer);

@MainThread

@NonNull

public abstract State getCurrentState();

@SuppressWarnings(“WeakerAccess”)

public enum Event {

/**

  • Constant for onCreate event of the {@link LifecycleOwner}.

*/

ON_CREATE,

/**

  • Constant for onStart event of the {@link LifecycleOwner}.

*/

ON_START,

/**

  • Constant for onResume event of the {@link LifecycleOwner}.

*/

ON_RESUME,

/**

  • Constant for onPause event of the {@link LifecycleOwner}.

*/

ON_PAUSE,

/**

  • Constant for onStop event of the {@link LifecycleOwner}.

*/

ON_STOP,

/**

  • Constant for onDestroy event of the {@link LifecycleOwner}.

*/

ON_DESTROY,

/**

  • An {@link Event Event} constant that can be used to match all events.

*/

ON_ANY

}

@SuppressWarnings(“WeakerAccess”)

public enum State {

DESTROYED,

INITIALIZED,

CREATED,

STARTED,

RESUMED;

public boolean isAtLeast(@NonNull State state) {

return compareTo(state) >= 0;

}

}

}

LifecycleRegistry是Lifecycle的一个实现,它是用在Fragment和Activity上的,它可以处理多个生命周期观察者. 具体它有什么作用,后面再讲.

2. ReportFragment的由来

下面是ComponentActivity的onCreate()方法.

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ReportFragment.injectIfNeededIn(this);

}

可以看到,在上面搞了一句,注入一个ReportFragment(报告Fragment? 纪检委员? 打小报告的? 当然,我只是猜测).

有一点眉目了,其实就是在Activity中搞了一个Fragment,Fragment的生命周期我们知道了,当然就知道了Activity的生命周期,接着通知相关的观察者即可.当然,这个Fragment是没有界面的. 我们来看看,这个注入的方法干了啥.

public class ReportFragment extends Fragment {

private static final String REPORT_FRAGMENT_TAG = “androidx.lifecycle”

  • “.LifecycleDispatcher.report_fragment_tag”;

public static void injectIfNeededIn(Activity activity) {

// ProcessLifecycleOwner should always correctly work and some activities may not extend

// FragmentActivity from support lib, so we use framework fragments for activities

android.app.FragmentManager manager = activity.getFragmentManager();

if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {

manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();

// Hopefully, we are the first to make a transaction.

manager.executePendingTransactions();

}

}

其实这个injectIfNeededIn()看起来像是注入的方法干的就是将Fragment添加到Activity中,

来看看这个ReportFragment的生命周期方法都干了些啥,

@Override

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

dispatchCreate(mProcessListener);

dispatch(Lifecycle.Event.ON_CREATE);

}

@Override

public void onStart() {

super.onStart();

dispatchStart(mProcessListener);

dispatch(Lifecycle.Event.ON_START);

}

private void dispatchCreate(ActivityInitializationListener listener) {

if (listener != null) {

listener.onCreate();

}

}

  1. 通过调用dispatchCreate(mProcessListener)方法,感觉从命名上(是不是有点像dispatchTouchEvent())看就知道是在干啥了: 分发当前的生命周期事件.

  2. dispatch(Lifecycle.Event.ON_START); 感觉这个方法也像是在分发事件.

我们跟着这个mProcessListener来看看是在哪里设置的

/**

  • Class that provides lifecycle for the whole application process.

*/

public class ProcessLifecycleOwner implements LifecycleOwner {

//注意,我是一个单例

private static final ProcessLifecycleOwner sInstance = new ProcessLifecycleOwner();

static void init(Context context) {

sInstance.attach(context);

}

void attach(Context context) {

mHandler = new Handler();

mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);

Application app = (Application) context.getApplicationContext();

app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {

@Override

public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

ReportFragment.get(activity).setProcessListener(mInitializationListener);

}

@Override

public void onActivityPaused(Activity activity) {

activityPaused();

}

@Override

public void onActivityStopped(Activity activity) {

activityStopped();

}

});

}

}

//Activity的监听器

ActivityInitializationListener mInitializationListener =

new ActivityInitializationListener() {

@Override

public void onCreate() {

}

@Override

public void onStart() {

activityStarted();

}

@Override

public void onResume() {

activityResumed();

}

private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);

//Activity创建的时候,分发Lifecycle.Event.ON_START事件

void activityStarted() {

mStartedCounter++;

if (mStartedCounter == 1 && mStopSent) {

mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);

mStopSent = false;

}

}

ReportFragment.java

static ReportFragment get(Activity activity) {

return (ReportFragment) activity.getFragmentManager().findFragmentByTag(

REPORT_FRAGMENT_TAG);

}

ProcessLifecycleOwner看起来就像是老大哥,给整个APP提供lifecycle的,也就是说通过它我们可以观察到整个应用程序的生命周期. 如何做到的? ProcessLifecycleOwner的attach()中registerActivityLifecycleCallbacks()注册了一个监听器,一旦有Activity创建就给它设置一个Listener.这样就保证了每个ReportFragment都有Listener.

既然是一个全局的单例,并且可以监听整个应用程序的生命周期,那么,肯定一开始就需要初始化.

既然没有让我们在Application里面初始化,那么肯定就是在ContentProvider里面初始化的.

3. 初始化

ps: 这里穿插一个小知识点: ContentProvider的onCreate()方法执行时间比Application的onCreate()执行时间还要早,而且肯定会执行.所以在ContentProvider的onCreate()方法里面初始化几个特殊的小东西是没啥问题的.

我们跟着ProcessLifecycleOwner的init()方法的调用处,来到了ProcessLifecycleOwnerInitializer,果不其然,它是一个ContentProvider.并且,在这里,真的就初始化了2个小东西.

public class ProcessLifecycleOwnerInitializer extends ContentProvider {

@Override

public boolean onCreate() {

LifecycleDispatcher.init(getContext());

ProcessLifecycleOwner.init(getContext());

return true;

}

}

  1. ProcessLifecycleOwner初始化就不说了,是拿来观察整个应用的生命周期的,其原理就是利用ReportFragment,我们稍后详细到来.

  2. LifecycleDispatcher尤其重要.

class LifecycleDispatcher {

static void init(Context context) {

//registerActivityLifecycleCallbacks 注册一个监听器

((Application) context.getApplicationContext())

.registerActivityLifecycleCallbacks(new DispatcherActivityCallback());

}

}

static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {

@Override

public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

//又来注入咯

ReportFragment.injectIfNeededIn(activity);

}

@Override

public void onActivityStopped(Activity activity) {

}

@Override

public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

}

}

初始化的时候,就注册了一个监听器,每个创建的时候都给它注入一个ReportFragment.咦?这里又来注入一次,不是每个Activity都注册了一次么,在ComponentActivity中,搞啥玩意儿?

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

我猜,可能是为了兼容吧.2次注入,确保万无一失.而且这个injectIfNeededIn()方法,内部实现是只会成功注入一次的,所以多调用一次,无所谓.

4. 分发事件

相当于,到了这里,应用程序里面的任何一个Activity都会被注入一个ReportFragment.而注入的这个无界面的ReportFragment是可以观察到当然Activity的生命周期的.

下面我们来仔细看一下,这个事件是如何一步步分发下去的.

ReportFragment.java

@Override

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

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

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

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

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

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图



里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
2799707684)]
[外链图片转存中…(img-b670Tn9S-1712799707684)]
[外链图片转存中…(img-OOebayx4-1712799707684)]
img

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

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-oaf3A4Wn-1712799707684)]

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图

[外链图片转存中…(img-9C7Uqvie-1712799707685)]
[外链图片转存中…(img-OXtFIORG-1712799707685)]
里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

[外链图片转存中…(img-w5xio27Y-1712799707685)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-V9AnwI39-1712799707685)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值