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。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐