Java最全你要的进阶,Jetpack核心组件Lifecycle的使用和源码解析,字节跳动硬件开发工程师面试经验

总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。

在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

##一、使用Lifecycle
####1. 引入Lifecycle
我们来看一下如何引入:

1.非androidX项目引入:

//运行时
implementation “android.arch.lifecycle:runtime:1.1.1”
// 编译期
annotationProcessor “android.arch.lifecycle:compiler:1.1.1”

2.androidX项目引入:

androidX是support库的新时代,Google正在将support迁移到androidx中.

implementation “androidx.lifecycle:lifecycle-runtime:2.0.0”
implementation “androidx.lifecycle:lifecycle-extensions:2.0.0”
implementation “androidx.lifecycle:lifecycle-common-java8:2.0.0”
annotationProcessor “androidx.lifecycle:lifecycle-compiler:2.0.0”

####2. 创建生命周期观察者

public class MyObserver implements LifecycleObserver {

private static final String TAG = “MyObserver”;

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.w(TAG, "onCreate: ");
}

@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.w(TAG, "onStart: ");
}

@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();
}
}

通过调用dispatchCreate(mProcessListener)方法,感觉从命名上(是不是有点像dispatchTouchEvent())看就知道是在干啥了: 分发当前的生命周期事件.
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) {
//又来注入咯

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

image

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

[外链图片转存中…(img-KMyZFt62-1715337464124)]

[外链图片转存中…(img-PDOVOw8I-1715337464124)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值