ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

金三银四Offer收割机:Android 面试核心知识点精讲,不打没准备的仗!

金三银四Offer收割机:Android 面试核心知识点精讲,不打没准备的仗! 想要进入大厂首先得明白成功离不开毅力和决心。无论学历、资历如何只要你有决心并愿意付出时间总会看到成果。但除了这些学习还需要注重效率。互联网上的免费资料虽多但筛选、整合和实际应用却需要花费大量时间。而且自己摸索很容易走弯路、踩坑而且学习内容也可能不够系统。对于想要进入大厂的开发者来说基础知识尤为关键。大厂通常深入考察候选人的基础知识不仅要求了解还需要深入掌握。因此仅仅依靠表面的了解很难在面试中脱颖而出。为了帮助大家更好地准备我们整理了一部分Android面试的核心知识点精讲。这些知识点不仅能帮助你巩固基础还能为深入学习和实际应用打下坚实基础。(完整指南扫码领取)1. Activity启动流程当启动一个新的Activity时系统会首先调用onCreate()方法。接着调用onStart()和onResume()方法使Activity对用户可见。onSaveInstanceState() 和 onRestoreInstanceState()onSaveInstanceState(): 当Activity可能不再存在时如屏幕旋转、用户导航离开等被调用用于保存Activity的状态。onRestoreInstanceState(): 在Activity的onCreate()之后被调用用于恢复之前保存的状态。启动模式和使用场景Standard: 默认模式每次启动都会创建新的实例。SingleTop: 如果Activity实例已经在任务栈的顶部则不会创建新的实例。SingleTask: 创建一个新的任务栈并在其中启动Activity实例。SingleInstance: 创建一个新的任务栈且只包含一个Activity实例。生命周期执行顺序Activity A - Activity B: A的onPause()和onStop()被调用B的onCreate()、onStart()和onResume()被调用。按返回键B的onPause()和onStop()被调用A的onRestart()、onStart()和onResume()被调用。其他生命周期场景横竖屏切换当前Activity会被销毁并重新创建。按Home键onPause()和onStop()被调用。锁屏与解锁屏幕取决于设备实现可能仅调用onPause()。透明ActivityonCreate()、onStart()和onResume()正常调用。Dialog Theme的Activity与普通Activity相同。弹出Dialog不影响Activity的生命周期。onStart() 和 onResume()、onPause() 和 onStop() 的区别onStart(): Activity对用户不可见但已加载。onResume(): Activity对用户可见且可以与用户交互。onPause(): Activity对用户仍可见但即将变为不可见。onStop(): Activity不再对用户可见。传递数据Intent: 用于在Activity之间传递数据大小有限制约1MB。解决方案使用Bundle、Serializable、Parcelable或数据库、文件存储等方式。onNewIntent()当Activity已存在并且再次接收到与其相同的Intent时调用。显示启动和隐式启动显示启动明确指定要启动的Activity。隐式启动基于Intent中的action和category来匹配要启动的Activity。Scheme使用场景用于定义自定义的URI格式如myapp://path/data。ANR应用程序无响应通常由于主线程长时间运行导致。onCreate和onRestoreInstanceonCreate(): 在Activity首次创建时调用。onRestoreInstance(): 在Activity重新创建后用于恢复状态。跨App启动Activity使用Intent并设置相应的flag。Activity任务栈存放Activity实例的栈结构。Flags如FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TOP等。数据保存与恢复使用Bundle保存和恢复数据。进程被Kill后数据从Bundle中恢复。2. Service生命周期创建、启动、绑定、销毁。两种启动方式startService(): 启动Service即使客户端解绑Service仍运行。bindService(): 绑定Service到客户端当客户端解绑时Service可能销毁。通信使用Messenger、AIDL、LocalBinder等方式。IntentService用于在后台执行异步任务处理完所有Intent后自动结束。onStartCommand返回值START_NOT_STICKY、START_STICKY、START_REDELIVER_INTENT。bindService和startService混合使用可以同时使用但需要注意生命周期和绑定状态。3. BroadcastReceiver分类和使用场景粘性广播、非粘性广播。用于接收系统或其他应用发送的广播。注册方式动态注册在代码中注册和注销。静态注册在AndroidManifest.xml中注册。原理BroadcastReceiver接收来自Intent的广播。4. ContentProviderContentProvider 是 Android 中用于实现数据共享的一种组件它可以让不同的应用程序之间共享数据。数据通常以表格的形式组织类似于数据库的表。其他应用程序可以通过 ContentResolver 来查询或修改这些数据。ContentProvider、ContentResolver、ContentObserver 的关系ContentProvider提供数据访问的接口。ContentResolver用于从 ContentProvider 中获取和修改数据它是应用程序与 ContentProvider 之间的桥梁。ContentObserver用于监听ContentProvider中的数据变化当数据发生变化时会通知注册的观察者。ContentProvider 的实现原理ContentProvider 的实现主要基于数据库如 SQLite来存储和管理数据。当其他应用通过 ContentResolver 访问数据时ContentProvider 会处理这些请求如查询、插入、更新和删除数据。ContentProvider 的优点数据共享允许不同的应用程序共享数据。安全性提供了一套权限控制机制确保只有具有相应权限的应用程序才能访问数据。统一接口所有 ContentProvider 都遵循相同的接口规范使得应用程序能够以一种统一的方式访问不同来源的数据。Uri (统一资源标识符)Uri 是用于唯一标识资源如文件、网页、数据库记录等的字符串。在 Android 中Uri 常用于标识 ContentProvider 中的数据。例如一个 Uri 可能表示一个特定的数据库记录或一组记录。5. HandlerHandler 的实现原理Handler 的工作原理基于 Looper 和 MessageQueue。当一个消息Message被发送到 Handler 时Handler 会将这个消息放入与当前线程关联的 MessageQueue 中。Looper 是一个无限循环它会不断从 MessageQueue 中取出消息并分发给相应的 Handler 进行处理。子线程中能否直接创建 Handler在子线程中不能直接创建 Handler因为子线程默认没有 Looper。只有主线程UI线程在启动时会自动创建 Looper。如果需要在子线程中使用 Handler需要先手动为子线程创建 Looper。主线程的 Looper 第一次调用 loop 方法的时间和类主线程的 Looper 在 Android 应用程序启动时由 ActivityThread 类创建并在主线程的 run 方法中调用 Looper.loop() 方法开始运行。Handler 导致的内存泄露原因及其解决方案Handler 导致的内存泄露通常是因为 Handler 持有 Activity 或其他 Context 的引用而这个 Handler 又被其他长生命周期的对象如静态变量、线程等持有。当 Activity 被销毁时由于 Handler 仍然持有其引用导致 Activity 无法被垃圾回收器回收从而造成内存泄露。解决方案通常包括使用静态内部类 弱引用WeakReference将 Handler 放在一个静态内部类中并使用弱引用持有 Context这样即使 Handler 被其他对象持有也不会阻止 Context 被回收。及时移除回调和消息确保在 Activity 销毁时移除所有与 Handler 相关的回调和消息避免在 Activity 销毁后还尝试访问它。一个线程可以有几个 Handler、Looper、MessageQueue 对象一个线程只能有一个 Looper 和一个 MessageQueue。但是一个线程可以有多个 Handler因为每个 Handler 都有自己的 Message 队列和回调接口但它们都共享同一个 Looper 和 MessageQueue。Message 对象的创建方式及区别Message 对象可以通过两种方式创建直接 new 一个 Message 对象或者调用 Message.obtain() 方法。直接使用 new 创建 Message 会导致频繁的对象分配和垃圾回收影响性能。而 Message.obtain() 方法会从 MessagePool消息池中复用 Message 对象减少内存分配和垃圾回收的开销。Message.obtain() 如何维护消息池Message.obtain() 方法会首先从 MessagePool 中获取一个已经被回收的 Message 对象如果存在的话。如果没有可用的对象它会创建一个新的 Message。当一个 Message 被处理完毕后它的 recycle() 方法会被调用将 Message 返回到 MessagePool 中供下次使用。Handler 的发送消息方法Handler 有多种发送消息的方法包括 sendMessage()、sendMessageDelayed()、sendEmptyMessage()、sendEmptyMessageDelayed() 等。这些方法的主要区别在于是否延迟发送消息以及是否携带数据。post 与 sendMessage 的区别和应用场景post() 方法用于在主线程中执行 Runnable 对象而 sendMessage() 方法用于发送一个 Message 对象到 MessageQueue 中。post() 方法通常用于执行简单的任务而 sendMessage() 方法更适合于需要传递数据和延迟执行的任务。handler postDelayed 后消息队列的变化当使用 postDelayed() 方法发送一个消息时这个消息会被放入 MessageQueue 中并根据指定的延迟时间排序。由于面试内容比较多篇幅有限资料已经被整理成了PDF文档有需要2024年Android中高级最全面试真题答案 完整文档的可扫码领取目录第一章 Java方面Java基础部分Java集合Java多线程Java虚拟机第二章 Android方面Android四大组件相关Android异步任务和消息机制Android UI绘制相关Android性能调优相关Android中的IPCAndroid系统SDK相关第三方框架分析综合技术数据结构方面设计模式计算机网络方面Kotlin方面第三章 音视频开发高频面试题为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?怎么做到直播秒开优化直方图在图像处理里面最重要的作用是什么数字图像滤波有哪些方法图像可以提取的特征有哪些衡量图像重建好坏的标准有哪些怎样计算第四章 Flutter高频面试题Dart部分Flutter部分第五章 算法高频面试题如何高效寻找素数如何运用二分查找算法如何高效解决雨水问题如何去除有序数组的重复元素如何高效进行模幂运算如何寻找最长回文子串第六章 Andrio Framework方面系统启动流程面试题解析Binder面试题解析Handler面试题解析AMS面试题解析
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进