Android面试八股文
Android面试八股文
1. Android基础知识
四大组件:
- Activity:界面展示,用户交互入口。
- Service:后台运行任务。
- BroadcastReceiver:广播接收器,监听系统或应用广播。
- ContentProvider:数据共享。
生命周期:
- Activity生命周期(onCreate、onStart、onResume、onPause、onStop、onDestroy)
- Fragment生命周期及与Activity的关系。
Intent:
- 显式Intent与隐式Intent。
- Intent传递数据(putExtra/getExtra)。
资源管理:
- 资源文件(strings.xml、colors.xml、dimens.xml等)。
- 布局文件(XML布局)。
2. Java基础
- 面向对象三大特性:继承、封装、多态。
- 常用集合:ArrayList、HashMap、HashSet。
- 异常处理:try-catch-finally,throws,throw。
- 多线程:
- Thread和Runnable。
- Handler机制。
- AsyncTask(已废弃,但面试仍可能问)。
- 线程同步(synchronized、volatile)。【synchronized范围过大可能存在死锁】【volatile多线程可见,值被更新时其他线程立即生效】
3. UI开发
- 常用布局:
- LinearLayout、RelativeLayout、ConstraintLayout。【ConstraintLayout更高效的布局,减少嵌套,提升渲染效率】
- 自定义View:
- onMeasure(决定大小)、onLayout(确定位置)、onDraw(绘制内容)方法。
- RecyclerView:
- Adapter、ViewHolder模式。
- 优化技巧(DiffUtil、分页加载)。
- 动画:
- 属性动画(ObjectAnimator、ValueAnimator)。
- 帧动画。
4. 数据存储
- SharedPreferences:轻量级存储。
- SQLite数据库:
- SQLiteOpenHelper使用。
- CRUD操作。
- ContentProvider:跨应用数据共享。
- 文件存储:内部存储、外部存储。
5. 网络编程
- HTTP协议基础。
- OkHttp、Retrofit使用。
- JSON解析:
- Gson、Fastjson。
- 网络请求异步处理。
6. 性能优化
- 内存泄漏:
- 常见原因(Handler、静态变量、匿名内部类)。
- LeakCanary工具。
- 启动优化:
- 冷启动、热启动。
- 优化方法(减少启动时加载内容)。
- 卡顿分析:
- TraceView、Systrace工具。
7. 高级知识
- 进程与线程:
- 主线程与子线程。
- 线程间通信。
- Binder机制:
- IPC通信基础。
- AIDL:
- 跨进程接口定义。
- Jetpack组件:
- LiveData、ViewModel、Room数据库。
8. 常见面试题示例
Activity和Fragment的区别?
Activity和Fragment是Android中两个重要的组件,它们有许多区别,主要体现在功能、生命周期、使用场景等方面。以下是它们的主要区别:
定义和作用
- Activity:表示一个独立的界面,是用户与应用交互的入口,负责管理整个屏幕的UI。
- Fragment:是Activity中的一个可复用的UI模块,可以看作是Activity的子界面,负责界面的一部分内容。
生命周期
- Activity有独立的生命周期(onCreate、onStart、onResume、onPause、onStop、onDestroy)。
- Fragment的生命周期依赖于所在的Activity,除了自身的生命周期方法外,还会受到Activity生命周期的影响(onAttach、onCreateView、onActivityCreated、onDetach等)。
使用场景
- Activity适合用作应用的单个独立页面。
- Fragment适合在同一个Activity中实现多个界面模块,支持动态添加、替换,常用于多屏适配(如平板和手机)。
复用性
- Fragment具有更好的复用性,可以在不同的Activity中复用。
- Activity一般作为独立页面,不适合复用。
交互方式
- Activity之间通过Intent传递数据。
- Fragment之间通过所在的Activity进行通信,或者使用ViewModel等方式。
管理方式
- Activity由系统直接管理。
- Fragment由Activity通过FragmentManager管理。
Handler的工作原理?
- 线程与Looper
每个线程可以有一个Looper,Looper负责不断地从该线程的消息队列(MessageQueue)中取出消息并分发处理。
主线程(UI线程)默认有一个Looper,子线程默认没有Looper,需要手动创建。
- MessageQueue(消息队列)
MessageQueue是一个先进先出(FIFO)的消息存储结构,存放着待处理的消息和Runnable任务。
- Handler的作用
Handler绑定到一个线程的Looper上,负责向该线程的MessageQueue发送消息或Runnable。
Handler可以发送消息(Message)或Runnable到消息队列,等待Looper循环取出并执行。
消息处理流程
当调用handler.sendMessage()或handler.post()时,消息或任务被放入MessageQueue。Looper不断循环,从MessageQueue中取出消息。取出的消息通过Handler的handleMessage()方法进行处理,或者执行Runnable任务。
什么是ANR,如何避免?
Application Not Responding 应用程序无响应
当应用程序的主线程在5秒内没有响应用户输入事件(如点击、触摸等),或者BroadcastReceiver在10秒内没有完成执行,系统就会触发ANR
-
导致ANR的常见原因
- 主线程执行了耗时操作(如网络请求、数据库操作、大量计算)。
- 主线程被死锁或阻塞。
- 广播接收器执行时间过长。
- 服务执行时间过长且阻塞主线程。
-
如何避免ANR?
- 避免在主线程执行耗时操作
- 网络请求、文件读写、数据库操作等放到子线程或使用异步处理(如AsyncTask、线程池、RxJava、Coroutine等)。
- 合理使用Handler和消息机制
- 避免Handler中执行耗时任务。
- 优化UI渲染和布局
- 减少复杂布局,避免过度绘制。【多使用ConstraintLayout布局,少使用透明、半透明背景,使用include重复使用】
使用异步加载和懒加载 - 延迟加载不必要的资源。
- 及时释放资源,避免死锁
- 注意线程同步,避免锁竞争。
- 使用StrictMode检测主线程耗时操作
- 开发阶段开启StrictMode,及时发现问题。
单例模式如何实现线程安全?
【双检查锁保证线程安全】
public static DoubleCheckedLockingSingleton getInstance() {
if (instance == null) { // ❗第一次检查:过滤已初始化的情况(无需加锁)
synchronized (DoubleCheckedLockingSingleton.class) { // ❗类锁(保证仅一个线程进入)
if (instance == null) { // ❗第二次检查:防止其他线程已初始化
instance = new DoubleCheckedLockingSingleton();
}
}
}
return instance;
}
Android中的四种启动模式?
- standard 每次启动都会创建新的activity实例-----大部分场景,每个activity可以独立存在,互不影响
- singleTop 若activity在栈顶,则调用onNewIntent方法;若不在栈顶,则创建新的实例;-----浏览器窗口
- singleTask 若任务栈存在该activity,则移除其上面的activity,使其置于栈顶;若无,则创建新的- activity实例将其放入新的任务栈中;-----登录界面
- singleInstance 是任务栈中的其他activity实例全部移除,只让其存在于一个独单的栈中【独占一个栈】------适用于电话拨号界面
如何防止内存泄漏?
- 避免静态引用持有 Activity 或 Context
- 正确管理生命周期
- 避免匿名内部类持有外部类的引用
RecyclerView和ListView的区别?
RecyclerView和ListView是Android中用于显示列表数据的两种控件,它们有一些重要的区别:
设计理念和灵活性
- ListView:较早的列表控件,功能相对简单,主要用于垂直滚动的列表。自定义和扩展性有限。
- RecyclerView:是ListView的升级版,设计更灵活,支持多种布局管理器(线性、网格、瀑布流等),更容易实现复杂的列表效果。
ViewHolder模式
- ListView:虽然可以使用ViewHolder模式来优化性能,但这是开发者手动实现的。
- RecyclerView:强制使用ViewHolder模式,提升了性能和代码结构的规范性。
布局管理器(LayoutManager)
- ListView:只支持垂直列表。
- RecyclerView:通过LayoutManager支持多种布局方式,如线性布局、网格布局和瀑布流布局。
动画支持
- ListView:动画支持有限,通常需要手动实现。
- RecyclerView:内置Item动画支持,方便实现添加、删除、移动等动画效果。
分割线和装饰
- ListView:内置简单的分割线支持。
- RecyclerView:没有内置分割线,需要通过ItemDecoration来自定义分割线和其他装饰。
数据变化通知
- ListView:使用notifyDataSetChanged()刷新整个列表,效率较低。
- RecyclerView:支持更细粒度的数据变化通知,如notifyItemInserted()、notifyItemRemoved()等,提升刷新效率。
总结:
RecyclerView比ListView更灵活、性能更好,适合复杂和高性能的列表需求;而ListView适合简单的垂直列表场景。如果是新项目,推荐使用RecyclerView。
更多推荐
所有评论(0)