知识体系和面试常见问题解析
技术专家全面讲解知识体系,面试常见问题经验总结,并提供辅导和咨询。
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 的关系?