跳到主要内容Android 一线大厂核心面试题汇总:Activity、Service 与性能优化 | 极客日志Java大前端java
Android 一线大厂核心面试题汇总:Activity、Service 与性能优化
综述由AI生成汇总了 Android 一线大厂面试的核心问题,涵盖 Activity 生命周期、Service 管理、ContentProvider 数据共享、ListView 优化、Fragment 切换、Java 基础、性能调优及 AIDL 通信等关键技术点。文章不仅列出了常见问题,还提供了简洁的技术解答与实现思路,帮助开发者系统复习 Android 开发核心知识,应对技术面试挑战。
GRACE Grace22 浏览 Android 一线大厂核心面试题汇总
本文整理了 Android 开发中常见的一线互联网大厂面试题,涵盖 Activity、Service、ContentProvider、性能优化等核心模块,并附带关键知识点解析,供开发者复习参考。
Activity
1. 什么是 Activity?
Activity 是 Android 应用中负责展示用户界面并与用户交互的组件。它是四大组件之一,每个 Activity 通常对应一个窗口。
2. 请描述一下 Activity 生命周期
主要方法包括:onCreate()(创建)、onStart()(可见)、onResume()(运行)、onPause()(暂停)、onStop()(停止)、onDestroy()(销毁)。
3. 请描述一下 Activity 的四个状态
Resumed(运行中)、Paused(暂停)、Stopped(停止)、Destroyed(销毁)。
4. 两个 Activity 之间传递数据,除了 intent,广播接收者,content provider 还有啥?
还可以使用 Application 对象、静态变量(慎用)、单例模式、SharedPreferences、数据库或 ViewModel 共享。
5. Android 中的 Context, Activity,Application 有什么区别?
Context 是上下文基类。Activity 继承 ContextThemeWrapper,有 UI 功能。Application 继承 ContextWrapper,代表整个应用进程,生命周期最长。
6. Context 是什么?
Context 提供访问应用资源、启动组件、获取系统服务等信息的基础接口。
7. 如何保存 Activity 的状态?
通过 onSaveInstanceState() 保存临时状态,在 onRestoreInstanceState() 恢复;或使用 ViewModel 保存配置变更时的数据。
8. 横竖屏切换时 Activity 的生命周期
默认情况下会销毁重建,执行 onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume。可通过设置 configChanges 避免重建。
9. 两个 Activity 之间跳转时必然会执行的是哪几个方法?
旧 Activity 的 onPause() 和新 Activity 的 onCreate() 及 onStart()、onResume()。
10. 如何将一个 Activity 设置成窗口的样式
在 Manifest 中设置 android:theme 属性,如 @style/Theme.AppCompat.NoActionBar。
11. Activity 的四种启动模式,singletop 和 singletask 区别是什么?
SingleTop:栈顶复用;SingleTask:整栈复用,若存在则清除其上方所有 Activity 并 bringToFront。
12. Activity 的四种启动模式,一般书签的使用模式是 singletop,那为什么不使用 singletask?
Singletask 会清除栈内其他页面,可能导致用户丢失浏览进度;Singletop 仅复用当前栈顶,体验更连贯。
13. 如何退出 Activity?如何安全退出已调用多个 Activity 的 Application?
调用 finish()。安全退出应用可维护一个 Activity 栈,遍历调用 finish() 并清空栈。
14. Activity-Window-View 三者的关系
Activity 持有 Window,Window 持有 DecorView,DecorView 包含 View 树。View 是具体的 UI 控件。
Broadcast Receiver
1. 如何注册 BroadcastReceiver
动态注册(代码中 registerReceiver)和静态注册(Manifest 中声明)。
2. Android 引入广播机制的用意
实现组件间解耦通信,允许不同应用或组件间传递消息。
3. 两种注册各有什么优缺点
动态注册灵活但需手动注销;静态注册无需注销但受限于系统限制,无法接收部分特定广播。
4. 广播的类型
标准广播(同步)、有序广播(异步/顺序)、本地广播(应用内)。
5. BroadcastReceiver 里能否进行耗时操作
6. 描述一下广播 BroadcastReceiver 的理解
7. BroadcastReceiver 的生命周期和注意事项
仅在收到广播时实例化,执行完 onReceive 即销毁。注意不要泄露 Context。
Service
1. Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的 Service?
使用 bindService() 绑定,通过 ServiceConnection 回调获取 IBinder。启动用 startService()。
2. 描述一下 Service 的生命周期
onCreate(), onStartCommand(), onBind(), onUnbind(), onDestroy()。
3. Activity、Intent、Service 是什么关系
Activity 通过 Intent 启动或绑定 Service,Intent 作为载体传递参数。
4. Service 是否在 main thread 中执行,service 里面是否能执行耗时的操作?
5. Service 和 Activity 在同一个线程吗
默认都在主线程,除非 Service 内部显式创建新线程。
6. Service 里面可以弹吐司么?
可以,但需注意 Context 类型,建议使用 ApplicationContext 或传入的 Context。
7. 在 service 的生命周期方法 onstartConmand() 可不可以执行网络操作?
不建议直接在主线程执行,应开启子线程处理网络请求。
8. 什么是 Service 以及描述下它的生命周期。Service 有哪些启动方法,有什么区别,怎样停用 Service?
Service 用于后台长时间运行。启动方式:startService(独立运行)和 bindService(绑定交互)。停用以 stopSelf() 或 unbindService()。
9. 什么是 IntentService?有何优点?
IntentService 继承 Service,自动处理消息队列,处理完后自动停止。适合一次性任务。
ContentProvider
1. 请介绍下 Android 的数据存储方式
SQLite 数据库、SharedPreferences、文件存储、ContentProvider。
2. 如何使用 ContentProvider 进行批量操作?
使用 ContentResolver 的 applyBatch() 方法。
3. 说说 ContentProvider、ContentResolver、ContentObserver 之间的关系
Provider 管理数据,Resolver 操作 Provider,Observer 监听数据变化。
4. 介绍下 ContentProvider 是如何实现数据共享的
5. 为什么要用 ContentProvider?它和 sql 的实现上有什么差别?
用于安全共享数据。SQL 是直接操作数据库,Provider 封装了 SQL 并提供权限控制。
Intent
1. 请描述一下 Intent 和 IntentFilter
Intent 是消息对象,IntentFilter 用于匹配 Intent 的 Action、Category、Data。
2. Intent 传递数据时,可以传递哪些类型数据?
基本类型、String、Parcelable、Serializable、Bundle 等。
3. Serializable 和 Parcelable 的区别
Serializable 基于反射,性能低;Parcelable 手写序列化,性能高,Android 推荐。
4. 隐式、显式 Intent 的区别
显式指定目标组件;隐式指定 Action/Category,由系统匹配。
ListView
1. 当 ListView 数据集改变后,如何更新 ListView
调用 adapter.notifyDataSetChanged()。
2. ListView 如何实现分页加载
监听滚动到底部事件,加载更多数据并刷新 Adapter。
3. 如何刷新 ListView 中单个 item 的数据,不刷新整个 ListView 的数据?
修改数据源后通知特定位置刷新,或重新绑定该 ViewHolder。
4. 上拉加载和下拉刷新怎么实现?
使用第三方库如 SwipeRefreshLayout 或自定义 Header/Footer。
5. ListView 中如何优化图片?
使用 Glide/Picasso 加载,按需加载,压缩尺寸。
6. Listview 里有 Button 点不动?
Item 布局中 focusable 或 clickable 冲突,设置 descendantFocusability="blocksDescendants"。
7. ListView 如何提高其效率?
使用 ViewHolder 模式,复用 convertView。
8. ListView 可以显示多种类型的条目吗?
可以,通过 getViewTypeCount() 和 getItemViewType() 区分。
9. ListView 如何定位到指定位置?
调用 setSelection(position)。
10. 如何在 ScrollView 中如何嵌入 ListView?
不推荐,建议改用 RecyclerView。若必须,需计算高度并禁用 MeasureSpec。
11. ListView 中图片错位的问题是如何产生的?
ViewHolder 复用导致数据错乱,确保在 bind 时正确赋值。
12. 你知道 ListView 的 setEmptyView 方法吗?
Fragment
1. 如何切换 fragment(不重新实例化)
使用 replace() 配合 addToBackStack() 或 show()/hide()。
2. Fragment 的优点
3. Fragment 如何实现类似 Activity 栈的压栈和出栈效果
使用 FragmentTransaction 的 addToBackStack()。
4. Fragment 的 replace 和 add 方法的区别
Replace 替换容器内容;Add 添加但不移除原有 Fragment。
5. Fragment 与 Activity 之间是如何传值的
6. Fragment 生命周期
onAttach, onCreate, onCreateView, onActivityCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach。
ViewPager 会缓存 Fragment,onDestroyView 可能不会立即执行,直到被移除。
Java 基础
1. 什么是重载,什么是重写,有什么区别?
重载(Overload)同方法名不同参数;重写(Override)子类覆盖父类方法。
2. String、StringBuffer 和 StringBuilder 的区别
String 不可变;StringBuffer 可变且线程安全;StringBuilder 可变非线程安全。
3. 知道的设计模式有哪些
4. TCP/IP 协议簇分哪几层?TCP、IP、XMPP、HTTP、分别属于哪一层?
四层:应用层、传输层、网络层、链路层。HTTP/XMPP 应用层,TCP 传输层,IP 网络层。
5. 继承和实现的区别
6. final, finally, finalize 的区别
final 修饰符;finally 异常捕获块;finalize GC 回收前调用。
7. int 和 Integer 的区别
int 基本类型;Integer 包装类,可为 null。
8. Java 中==,equal 和 hashCode 的区别
==比较引用或值;equals 比较内容;hashCode 哈希码。
性能优化
1. 如何对 Android 应用进行性能分析
使用 Systrace、Profiler、LeakCanary 等工具。
2. 什么情况下会导致内存泄露
静态集合持有 Context、未注销的 Listener、单例不当使用。
3. 内存溢出的几点原因
4. 针对 static 的解决方案
避免 static 持有 Context,使用 WeakReference。
5. 线程导致内存溢出及解决
6. 举例几种 OOM 异常情况
Bitmap 解码失败、List 无限增长、数据库游标未关闭。
7. 如何处理图片过大导致 OOM
压缩图片,使用 inSampleSize,使用 LruCache。
8. Android 中如何捕获未捕获的异常
实现 Thread.UncaughtExceptionHandler。
9. ANR 是什么?怎样避免和解决 ANR
Application Not Responding。避免主线程耗时操作,优化 IO 和网络。
10. 多线程间通信和多进程之间通信有什么不同,分别怎么实现?
线程用 Handler/Atomic;多进程用 Binder/Messenger/Socket。
11. Devik 进程,linux 进程,线程的区别
Dalvik/ART 是虚拟机进程;Linux 是内核进程;线程是 CPU 调度单元。
12. Android 线程间通信有哪几种方式
Handler、MessageQueue、Locks、Atomic。
13. 如何合理使用内存?
屏幕适配+AIDL
屏幕适配
- 基础概念:不同分辨率、DPI 适配。
- 适配方式:dp/sp、ConstraintLayout、适配框架(如 AdaptX)。
AIDL
- 什么是 AIDL 以及如何使用:Android Interface Definition Language,用于 IPC。定义接口
.aidl 文件。
- 如何工作?能处理哪些类型的数据?
通过 Binder 机制。支持基本类型、String、List、Map 及 Parcelable 对象。
动画 + 事件处理
动画
- Android 中的动画有哪几类:Tween(补间)、Frame(帧)、Property(属性)。
- 动画能组合在一起使用么?
可以,通过 AnimationSet。
- 插值器的种类有哪些?
AccelerateDecelerate、Overshoot、Bounce 等。
- 如何自定义插值器
继承
TimeInterpolator 重写 getInterpolation。
- 如何修改 Activity 进入和退出动画
在 Theme 中设置
windowAnimationStyle。
事件处理
- Handler 机制
MessageQueue + Looper + Handler 实现线程间通信。
- onTouch 和 onTouchEvent 有什么区别
onTouch 返回 true 可拦截;onTouchEvent 最终处理。前者优先级高。
- 子线程中能不能 new handler?为什么?
不能,Handler 关联当前线程 Looper,子线程无 Looper 会报错。
- 子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么?
RunOnUiThread、ViewModel、LiveData、Coroutines。
- 为什么系统不建议在子线程访问 UI?
UI 线程不安全,可能导致闪烁或崩溃。
经验
1. 开发中都使用过哪些框架、平台
RxJava、Glide、Retrofit、OkHttp、Dagger、ButterKnife 等。
2. 三级缓存的原理
内存缓存(LruCache)、磁盘缓存(DiskLruCache)、网络请求。
3. 清除缓存是怎么做的?
删除缓存目录文件或调用 clearDiskCache()。
4. 推送的好处
5. 为什么数据要以 json 形式传输?
6. 项目流程
需求分析 -> 设计 -> 开发 -> 测试 -> 上线 -> 运维。
7. 自定义 view 关键词
Measure、Layout、Draw、OnTouchListener。
8. 自定义 view 的实现思路
继承 View -> 重写 onMeasure/onDraw -> 处理触摸事件。
9. retrofit 使用
定义 API 接口,配置 OkHttp,发起请求。
10. 组件化的优势
11. 插件化的优势
12. 打包原理
编译源码 -> 生成 dex -> 合并资源 -> 签名 -> apk。
13. 安装流程
下载 -> 校验签名 -> 解压 -> 安装 dex -> 注册组件。
14. 如何防止反编译(提高反编译难度)
混淆(ProGuard/R8)、加固、加壳、代码加密。
15. v1,v2 签名结果
V1 基于 JarSigner;V2 基于 APK Signature Scheme v2,安全性更高。
16. Android 与服务器交互的方式中的对称加密和非对称加密是什么?
对称:AES/DES,密钥相同;非对称:RSA/ECC,公钥加密私钥解密。
17. 进程保活方案
前台服务、JobScheduler、系统白名单、双进程守护。
18. Binder 机制的优势
19. URI 和 URL 的区别
URI 统一资源标识符;URL 统一资源定位符,是 URI 的子集。
20. TLS/SSL 握手
客户端发送 Hello -> 服务端回应证书 -> 协商密钥 -> 建立加密通道。
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online