知识体系和面试常见问题解析

技术专家全面讲解知识体系,面试常见问题经验总结,并提供辅导和咨询。

助理老师QQ

Android 面试题

Kotlin

  • 讲一下 Kotlin 中 Unit 类型的作用以及与 Java 中 Void 的区别。
  • Kotlin 中该如何安全地处理可空类型?
  • Kotlin 中的数据类型有隐式转换吗?为什么?
  • Kotlin 中 的 Any 与 Java 中的 Object 有何异同?
  • 在 Kotlin 中,什么是内联函数?有什么作用?
  • 讲讲 Kotlin 中 with 与 apply 函数的使用场景和区别。
  • 谈谈 Kotlin 中的构造方法,有哪些注意事项?
  • Kotlin 中的可见性修饰符有哪些?相比于 Java 有什么区别?
  • 讲讲 @JvmOverloads 的作用。
  • 谈谈你对 Kotlin 中的 data 关键字的理解。
  • 什么是委托属性?其使用场景和原理?
  • 讲讲 Kotlin 中 infix 关键字的原理和使用场景。
  • 在 Kotlin 中,何为解构?应该如何使用?
  • 讲讲 Kotlin 中 List 与 MutableList 的区别。
  • Kotlin 中集合遍历有哪几种方式?
  • 谈谈 Kotlin 中的 Sequence,为什么它处理集合操作更加高效?
  • Kotlin 中的 Coroutines 与线程有什么区别?有哪些优点?
  • 为什么协程比线程要轻量?
  • 讲一下 Kotlin 中单例的几种常见实现方式。
  • 通过对象表达式 object 和 lambda 表达式实现的函数式接口内部有何不同?
  • Kotlin 与 Java 混合开发时需要注意哪些问题?

四大组件

  • 说一下四大组件的生命周期和用法。
  • 讲讲 Activity 的启动流程。
  • 讲讲 Android 几种 LaunchMode 的特点和应用场景。
  • Activity A 跳转 Activity B,Activity B 再按 back 键回退,两个 Activity 各自的生命周期函数的执行顺序是怎样的?
  • 讲一下 Activity 上有 Dialog 的时候,按 Home 键时的生命周期情况。
  • 介绍一下 Fragment 的生命周期。
  • Fragment 之间如何通信?
  • 讲讲 Fragment 的懒加载实现。
  • 谈谈 Activity 与 Fragment 之间常用的通信方式。
  • 讲讲 Fragment 之间传递数据的方式。
  • 讲一下横竖屏切换时 Activity 的生命周期变化。
  • 横竖屏切换时如何保存 Activity 的状态?
  • Activity 的 onSavedInstanceState 在什么时候调用?
  • Kill process,onSavedInstanceState 会不会调用?
  • 讲讲 Activity 中 onNewIntent 方法的调用时机以及使用场景。
  • 子线程执行 context.startActivity(),会不会有问题?
  • 谈谈隐式 Intent 和显式 Intent。
  • 谈谈 IntentFilter 的匹配机制以及使用场景。
  • Intent 传输数据的大小是否有限制?如何解决?
  • 为什么要用 Bundle 传递数据?为什么不能使用 Map 数据结构?
  • 什么是 PendingIntent?
  • 谈谈 startService 和 bindService 的区别、生命周期以及使用场景。
  • 说一下 Service 的生命周期。
  • 谈谈 Service 与 IntentService 的区别。
  • 讲讲 IntentService 的实现原理和使用场景。
  • Service 如何进行保活?
  • Service 和 Activity 怎么进行数据通信?
  • 介绍一下广播的分类。
  • 讲讲广播的使用方式和场景。
  • BroadcastReceiver 与 LocalBroadcastReceiver 有什么区别?
  • Android 中 ContentProvider 的作用。
  • ContentProvider 实现数据共享的原理?
  • 谈谈 ContentProvider、ContentResolver、ContentObserver 之间的关系。
  • 谈谈 Context。
  • 讲一下 Application 和 Activity 的 Context 的区别。

常用组件

  • 讲讲 RecyclerView 与 ListView 的缓存实现原理、区别、优缺点。
  • 谈谈 RecyclerView 的缓存机制。
  • 谈谈 RecyclerView 的优化。
  • 讲讲 RecyclerView.Adapter 的几种数据刷新方式和区别。
  • 谈谈 WebView 与 JS 的交互方式,shouldOverrideUrlLoading、onJsPrompt 的使用有什么区别?

系统

  • 介绍一下 Android 系统架构,层与层之间的调用。
  • 讲讲对 ActivityThread 的理解。
  • 讲一下 App 的启动流程。
  • 讲讲 Android 匿名共享内存(Ashmem)的实现原理。
  • 谈谈 Binder 机制,与内存共享机制有什么区别?
  • 谈谈为什么 Android 要采用 Binder 作为 IPC 机制?
  • 谈谈选择 Binder 做为 Android 跨进程通信主要方式的原因?
  • 谈谈 Lifecycle,以及实现原理和使用场景。
  • 什么是 ANR?如何避免 ANR 的发生?
  • 如何在 Android 应用中执行耗时操作?
  • 在 Android 中,后台操作可以使用哪些方式?
  • 讲一下 ArrayMap 和 HashMap 的区别。
  • 讲讲 SparseArray 的使用及实现原理。
  • 讲一下 SparseArray 和 HashMap 的区别。
  • 谈谈 Android 中的 HashMap、ArrayMap 和 SparseArray。
  • 讲讲 LruCache 的实现原理。
  • Android 应用中如何保存数据?
  • Android 应用有哪些存储数据的方式?
  • 介绍一下 SharedPreferences 的实现原理,commit和apply的原理。apply 操作会导致 ANR 吗?
  • SharedPreferences 是线程安全的吗?它的 commit 和 apply 方法有什么区别?
  • SharedPreferences 可以跨进程使用吗?
  • 讲一下 Android 序列化对象的两种方式。
  • 序列化对象用在什么方面?
  • 讲一下 Serializable 和 Parcelable 的区别。
  • 谈谈 AMS、WMS 的工作原理。
  • 谈谈 Android 的通知系统。
  • 如何理解 Doze 模式?如何理解应用程序待机模式?
  • 讲一下 JobScheduler。
  • 谈谈对 JNI 的理解。
  • 介绍一下 SurfaceFlinger,VSYNC 信号的处理。
  • 讲讲安卓 Apk 的构建流程。
  • 讲一下 Apk 的安装过程。
  • Asset 目录与 res 目录有什么区别?
  • 谈谈 Android 的签名机制,不同版本下的签名有什么不同?
  • Java 与 JS 代码如何互相调用?
  • 讲讲 Java 虚拟机和 Dalvik 虚拟机的区别。
  • 讲一下 JVM、Dalvik、ART 实现原理和区别。
  • 谈谈 Android 类加载器。
  • 说一下 PathClassLoader 和 DexClassLoader 有什么区别?
  • 谈谈 Android P 禁用 HTTP 协议对开发的影响。
  • 介绍一下 Android 9.0 的新特性。
  • 谈谈 Android 10 如何进行适配?
  • Android 的线程数量有没有上限?
  • 谈谈 Android 权限的保护等级。

消息机制

  • 谈谈 Android 中消息机制和原理。
  • 谈谈 Handler 的机制和原理,postDelay() 的实现原理,post() 与 sendMessage() 的区别,Looper.loop() 为什么不会阻塞主线程?
  • 讲讲 Handler 的 post 和 sendMessage 方法的区别和使用场景。
  • 讲解 Android Handler 的 postdelayed 原理,postdelayed 设置定长时间等待,中间有新的 message 会如何处理?
  • 谈谈 IdleHandler (闲时机制)。
  • 谈谈对 IdleHandler 的理解,使用 Handler 需要注意哪些问题,以及如何解决?
  • 能不能在子线程中创建 Handler?
  • 谈谈 HandlerThread 的使用场景和实现原理。
  • Handler 中有 Loop 死循环为什么没有阻塞主线程?
  • Looper.loop() 为什么不会阻塞主线程?
  • 讲讲同步屏障机制。
  • 谈谈对 Activity.runOnUiThread 的理解。
  • Android 的子线程能否更新 UI。
  • 谈谈 IntentService 的使用场景和实现原理。
  • 谈谈 AsyncTask 的优缺点,实现原理。
  • AsyncTask 的生命周期和它所属的 Activity 的生命周期是什么关系?使用中会导致什么样的问题?
  • 如何取消 AsyncTask?

IPC

  • Android 多进程有哪些使用场景?
  • Android 中进程间通信有哪些方式?
  • 介绍一下 LocalSocket 的使用场景。
  • 什么是 AIDL?说一下通过 AIDL 创建服务的步骤。
  • 什么是 AIDL?使用场景有哪些?

UI

  • 说一下 getWidth() 方法和 getMeasureWidth() 区别。
  • 谈谈 getDimension、getDimensionPixelOffset 和 getDimensionPixelSize 的区别。
  • 讲一下 requestLayout,invalidate,postInvalidate 的区别与联系。
  • 怎么计算 View 在屏幕可见部分的百分比?
  • 获取 View 宽高的方法有哪些?
  • View.post() 为什么可以获取 View 的宽高信息?
  • View.inflate 和 LayoutInflater.inflate 有什么区别?
  • LayoutInflater 如何通过 inflate 方法获取具体 View?
  • 对比一下 LinearLayout、FrameLayout 和 RelativeLayout 的效率。
  • 有用过ConstraintLayout吗?它有哪些特点?
  • Android 为什么要在主线程绘制 UI?
  • 讲讲 Android UI 刷新原理。
  • 讲讲 Android 中 UI 的刷新机制。
  • 讲讲 View 的绘制原理。
  • 谈谈对 Window 和 WindowManager 的理解。
  • 介绍一下 Activity、View 和 Window 三者的关系。
  • 谈谈 Window 和 DecorView 的关系。
  • 谈谈 Android 的事件分发机制。
  • 事件分发中 onTouch 和 onTouchEvent 有什么区别?
  • 点击事件被拦截,但是想传到子 View,怎么实现?
  • Android 中怎么处理多点触控?
  • 文本样式接口(Spannable)是什么?
  • StaticLayout 的用法和使用场景。
  • 谈谈 SurfaceView 与 TextureView 的使用场景和用法。
  • 讲一下 SurfaceView 的原理。
  • 什么是 RemoteViews?有哪些使用场景?
  • 谈谈 Android 补间动画和属性动画的区别。
  • 谈谈属性动画的插值器和估值器。
  • Bitmap 和 .9 图片有什么区别?
  • WebP 和 SVG 格式的图片各自有什么特点?应该如何使用?
  • 如何计算图片所占的内存大小?
  • 讲一下 Android 图像高斯模糊的原理。
  • 讲讲 Android 屏幕适配的方式。
  • 如何实现 Fragment 懒加载?
  • 如何优化 ListView?

自定义 View

  • 谈谈自定义 View 和 ViewGroup 的实现流程和区别。
  • ViewGroup 的 onlayout 函数做了什么?
  • 什么是 MeasureSpec?
  • 谈谈 Android 自定义 View 的实现步骤,要绘制一个正方形的 view 如何实现?
  • 如何优化自定义 View?

性能优化

  • 谈谈对 Android 性能优化的了解。
  • Android 性能优化有哪些方法?
  • 如何理解严格模式(StrictMode)?
  • 讲讲 App 启动优化。
  • 谈谈 UI 方面的优化。
  • 谈谈布局优化。
  • 如何处理大图片的加载?
  • 讲讲 Android 中图片资源的优化。
  • 谈谈 App 的耗电量优化。
  • 如何降低 Android 应用的耗电量?
  • 什么情况下会导致内存泄漏?如何解决?
  • 谈谈 Android 中内存优化的方法。
  • 内存溢出和内存泄漏有什么区别?内存优化有哪些方法?
  • 使用 Handler 时如何避免内存泄漏问题?
  • 如何排查应用崩溃问题?
  • 什么情况会导致 OOM 问题?如何解决?
  • 下载一张很大的图片,如何保证不出现 OOM?
  • 讲一下 ANR 出现的场景以及解决方案。
  • 谈谈对 WebView 的优化。
  • 讲一下 Apk 瘦身的方法。
  • 如何对网络请求进行优化?
  • Android Native Crash 问题如何分析定位?

第三方库

  • 谈谈网络请求中的拦截器的实现原理和使用场景。
  • 讲讲 OkHttp 内部实现原理、有没有缓存。
  • 介绍下 Retrofit 框架,Retrofit 为什么要包装 OkHttp?
  • 讲讲 Retrofit 内部实现,以及常用的配置。
  • 讲讲 Glide 的缓存机制。
  • 谈谈 Lottie 的实现原理。
  • 讲讲 RxLifecycle 原理。
  • 讲讲 ViewModel 的实现原理。
  • 讲讲 RxJava 的作用以及优缺点。
  • 讲讲 RxJava 发送事件的步骤。
  • 讲讲 RxJava 的背压原理。
  • 讲讲 LeakCanray 的工作原理。
  • 讲讲 ButterKnife 的实现原理。
  • 讲讲 EventBus 的实现原理。

设计模式

  • 谈谈面向对象的六大基本原则。
  • 谈谈项目中用到的设计模式和使用场景。
  • 介绍一下常见的设计模式。
  • 谈谈几种常见的工厂模式以及它们的用法。
  • 谈谈对原型模式的理解。
  • 谈谈观察者模式、责任链模式。
  • 谈谈策略模式及其应用场景。
  • 谈谈静态代理和动态代理的区别,什么场景使用?

软件设计

  • 项目中本地存储怎么设计实现的?
  • LRU 怎么实现?
  • 用户行为监控方案设计。
  • 如何实现数据埋点?
  • 设计 IM 聊天的页面。
  • 如何获取 Android 设备唯一 ID?

架构设计

  • 介绍一下 MVC 和 MVP。
  • 谈谈对 MVC 和 MVP 的理解。
  • MVP 中如何处理 Presenter 层以防止内存泄漏?
  • 介绍一下 MVVM。
  • 谈谈 AOP?在 Android 中它有哪些应用场景?
  • 谈谈对新框架的了解和看法。

热修复

  • 讲讲热修复的原理。
  • Android 热修复 Tinker。
  • Android 热修复 Tinker Gradle Plugin。

动态化

  • 谈谈 Android 动态加载技术关键问题。
  • 讲讲 Hybrid 的通信原理。
  • 谈谈 RN 页面对用户行为的监控与 JS 错误治理。
  • 讲讲 RN 通用容器的设计。
  • 如何实现 RN 的页面追踪埋点?
  • 美团 RN 相对于原生 RN 有什么优势?
  • 美团 RN 与 美团 Picasso 的区别。
  • 讲讲 JS 错误治理方案。
  • Native、H5、RN 页面混合跳转时,页面清栈的桥如何实现?
  • 谈谈对 Flutter 的了解。
  • 介绍一下 Flutter 的架构。
  • 谈谈 Flutter 对比 Android 原生开发的优劣。

插件化

  • 谈谈插件化的实现原理。
  • 讲讲滴滴插件化方案 VirtualApk。
  • 谈谈 Android 插件化 Hook Activity 启动过程。
  • 谈谈 Android 插件化 Hook View 点击劫持。

开发调试

  • 谈谈 APK 的打包过程。
  • APK 为什么要签名?是否了解过签名机制?
  • APK 安装流程。
  • 说一下 adb 常用的命令行。
  • 如何优化 Gradle 的构建速度?
  • Gradle 自定义插件。
  • Android 64k 问题解决。
  • Android Dex 分包。
  • 谈谈 Android 分包的原理。
  • 如何适配各种机型?

测试

  • 谈谈 Android 应用程序测试指标。
  • 讲讲 Espresso 的使用?
  • 讲讲 Robolectric。
  • 讲讲 UI-Automator。
  • 讲讲 Mockito。

其他常见问题

  • 谈谈优先级翻转。
  • 如何实现 Android 的消息推送?
  • 如何进行多渠道打包?
  • 谈谈 Android Studio 多渠道打包。
  • 如何面向特定用户群体发布应用程序版本?
  • 讲讲 APK 加固的实现方案和原理。
  • 谈谈 APK 逆向工程。

开放性问题

  • 谈谈提升开发效率的方法。
  • 项目中有没有做过什么优化?
  • 谈谈项目开发中遇到过的最大难题,以及如何解决的?
  • 讲讲在项目中遇到的比较有挑战的事情。
  • 谈谈未来的职业规划。
  • 如何看待 Flutter,React Native 与 Android 的关系?