2019 即将进入尾声,趁着双十一之后的空闲时期,整理下 Android 面试题。
第一次看文章的朋友可以关注我,会不定期发布 Android 面试内容、进阶专题等等。
1.Activity 中的几种启动模式
2.android 消息机制
3.IntentService
IntentService 是 google 在原生的 Service 基础上通过创建子线程的 Service。也就是说 IntentService 是专门为 android 开发者提供的能在 service 内部实现耗时操作的 service。我们可以通过重写 onHandleIntent 方法实现耗时操作的回调处理,而且 IntentService 在耗时操作完成后,会主动销毁自己,IntentService 可以通过多次启动来完成多个任务,而 IntentService 只会被创建一次,每次启动的时候只会触发 onStart 方法。内部是实现了 Handler 异步处理耗时操作的过程,一般多用在 Service 中需要处理耗时操作的功能。
提问:为什么 IntentService 中能实现耗时操作?
- 在 onCreate 中,通过 HandlerThread 来开启一条线程,而 HandlerThread 线程中会跟我们平常用的 Handler 不太一样,在 run 方法中创建了 looper 对象,所以 HandlerThread 能让 IntentService 在子线程中使用 handler 达到耗时操作。
4.HandlerThread
HandlerThread 本身也是 Thread,只是在 Thread 基础上封装上了 Handler 的载体,并且在 run 方法中创建了 looper 对象,这也是为什么在 IntentService 中能在 HandlerThread 中直接用 handler 的原因。而我们知道一个线程是可以有多个 handler,所以用 HandlerThread 更加方便我们不用关心 Handler 的创建,一般用在多线程中直接处理任务。
5. 事件分发
6.android 性能优化、内存优化
7. 内存优化
内存优化通常指的内存溢出,主要涉及到的问题还是该释放的资源,没有及时让 GC 处理器回收,通常主要表现是动画、上下文对象、EventBus、AsycTask、Handler、单例 Bitmap 都会影响,通常要做的是释放他们未终止的动作,释放锁定的上下文对象。
在实际项目有 mvp 架构的时候,需要注意内存泄漏的问题,p 层如果长期持有 v 层的实例,导致 v 层的对象难以回收,而 v 层一般是 activity 或 fragment 作为抽象,因此需要在 p 层使用 v 层的弱应用或是在 p 层中实现 v 层的销毁方法,处理销毁的逻辑。
8.View 的绘制
9.App 启动流程
10.Eventbus 原理
11.Rxjava 的操作符有哪些,说说他们的作用
just: 将同种数据源组合放到被观察者上面
from: 将类似数组、集合的数据源放到被观察者上面
map: 将一种数据源,转化成另外一种
flatmap: 将一种数据源,转化成另外一种数据,并且被转化的数据是乱序排列的
concatmap: 将一种数据源,转化成另外一种数据,并且被转化的数据是按照先前的数据源顺序排序的
toList: 将数组的形式转化成 List 集合
subscribeOn: 设置 Observable 的 call 方法所在的线程,也就是数据来源的线程
observeOn: 设置 subscribe 的 call 方法所在的线程,也就是数据处理的线程
filter: 在被观察者的数据层过滤数据
onErrorResumeNext: 出错的时候,可以指定出错的时候的被观察者
retryWhen: 出错的时候,重新走一遍被订阅的过程
concat: 合并相同类型的被观察者到一个被观察者身上,有点类似集合、数组拼接数据。
zip: 处理多种不同结果集的数据发射,一般用得多的地方是多个网络请求组合然后统一处理业务逻辑。还有很多操作符就自己去看,这些操作符已经够面试用的了。
12. 线程锁 锁方法和类对象啥的有啥区别
线程锁锁方法: 是需要等到该线程用完了该方法才能释放同步锁 线程锁锁类对象: 是需要等到该线程用完了该类对象才能释放同步锁 区别: 是锁方法的区域要小 锁类对象包括了该类的所有属性
13.AsyncTask 原理
14. 说说 MVP 和 MVVM 的特点
15.android 中用到的观察者模式有哪些地方
16. 说说 google 新出的 Lifecycle 框架
将类的生命周期方法移交到 Lifecycle 中管理,实现对类的生命周期的监听,从而在 Lifecycle 中处理生命周期的逻辑代码。
这里涉及到几个对象: LifecycleObserver 接口(Lifecycle 观察者):实现该接口的类,通过注解的方式,可以通过被 LifecycleOwner 类的 addObserver(LifecycleObserver o)方法注册, 被注册后,LifecycleObserver 便可以观察到 LifecycleOwner 的生命周期事件。
LifecycleOwner 接口(Lifecycle 持有者):实现该接口的类持有生命周期 (Lifecycle 对象),该接口的生命周期(Lifecycle 对象) 的改变会被其注册的观察者 LifecycleObserver 观察到并触发其对应的事件。
Lifecycle(生命周期):和 LifecycleOwner 不同的是,LifecycleOwner 本身持有 Lifecycle 对象,LifecycleOwner 通过其 Lifecycle getLifecycle()的接口获取内部 Lifecycle 对象。
State(当前生命周期所处状态):几种事件状态。Event(当前生命周期改变对应的事件):当 Lifecycle 发生改变,事件状态的回调 event
17.okhttp 原理
18.Retrofit 原理
19.RxJava 的线程切换原理
- RxJava 通过 subscribeOn 指定被观察者发生的线程,observeOn 指定观察者发生的线程。其中 http://Schedulers.IO 生成的是 IoScheduler。
通过观察者与被观察者订阅的过程中,首先会触发被观察者的 subscribeActual 方法,在该方法中,可以看到最终会走 scheduler 的 schedule 方法,所以上面提到的 IoScheduler 实际是调用了它的 schedule 方法,最终会在 NewThreadWorker 里面生成 ScheduledExecutorService 对象,
而 ScheduledExecutorService 实际是由 ScheduledThreadPoolExecutor 创建的一个核心线程,最大线程个数是 Integer.MAX_VALUE 的线程池。最终会由 ScheduledThreadPoolExecutor 的 submit 或 schedule 方法执行传过来的 Runnable 对象,而 Runnable 执行的是被观察者的 subscribe 方法。所以解释了被观察者的 subscribe 方法是在子线程中执行的。
- observeOn 是观察者发生的线程,AndroidSchedulers.mainThread()实质是 HandlerScheduler 对象,而在观察者部分,最终观察部分会走 Scheduler 的 scheduleDirect 方法,而 HandlerScheduler 的该方法里面包装了一个 ScheduledRunnable 对象,通过主线程的 handler.postDelayed 处理这个 runnable 对象。
20.RecyclerView 源码、缓存分析
21.Binder 机制
22.Android Jetpack
23. 系统打包经过了哪几个流程
24.Kotlin
kotlin 使用了一组新的语法糖,kotlin 不让变量初始化空的类型,强大的非空设计思想比 java 要人性化,在代码编写阶段就有提示开发者的好处。还有它的内联函数,函数体作为返回值的各种简写方式使更多的人愿意接受 kotlin。它的协成开发比较好的控制线程之间切换的多层嵌套的问题,以及它简洁的语法,比较受开发者青睐。
由于篇幅有限,有些答案放在了我整理好的 PDF 文档里,需要点
【面试】
还有 Java 语言进阶与内核、Android 进阶、移动架构师项目、微信小程序员开发、跨平台 flutter 开发等学习视频。