Android面试题实战总结:100道经典案例与解析

本文精选Android开发高频核心面试题,涵盖Java/Kotlin基础、Android框架、性能优化、设计模式、网络通信、多线程等6大模块,每类提供典型例题与深度解析,助你系统掌握面试要点。


一、Java/Kotlin基础(20题)

例题1:HashMap原理

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
// 触发扩容的临界条件是什么?

解析
当元素数量超过$threshold = capacity \times loadFactor$时触发扩容(默认$loadFactor=0.75$)。JDK8引入红黑树优化,链表长度≥8且桶数量≥64时转树结构。

例题2:Kotlin协程挂起本质

suspend fun fetchData(): String {
    delay(1000)
    return "Data"
}

解析
挂起函数通过Continuation实现状态机模型,底层用COROUTINE_SUSPENDED标识暂停点,线程资源立即释放,恢复时从断点继续执行。


二、Android框架(25题)

例题3:Activity启动模式

<activity android:name=".DetailActivity" 
          android:launchMode="singleTask"/>

解析
singleTask创建时检查任务栈,若存在实例则清除其顶部所有Activity并复用。适用于主页等唯一性场景,通过taskAffinity可指定独立栈。

例题4:View事件分发

public boolean dispatchTouchEvent(MotionEvent ev) {
    // 事件传递顺序是?
}

解析
传递链:Activity -> Window -> ViewGroup -> View。关键方法优先级:
$$ \text{onInterceptTouchEvent} > \text{onTouchEvent} > \text{onClick} $$
可通过requestDisallowInterceptTouchEvent()中断父容器拦截。


三、性能优化(15题)

例题5:内存泄漏检测

public class Singleton {
    private static Context context; // 潜在泄漏点
}

解析
检测工具

  • LeakCanary自动化追踪引用链
  • Android Profiler观察Heap Dump
    解决方案
  • 使用Application Context
  • 弱引用WeakReference存储

例题6:卡顿优化

void onDraw(Canvas canvas) {
    for (int i=0; i<10000; i++) { // 主线程耗时操作
        drawItem(canvas); 
    }
}

解析
优化策略

  • 使用Choreographer监控帧率
  • 复杂计算移交RxJavaCoroutine
  • 视图层级深度≤10(通过Layout Inspector验证)

四、设计模式(15题)

例题7:LiveData设计原理

public class StockLiveData extends LiveData<BigDecimal> {
    private StockManager stockManager;
    
    @Override
    protected void onActive() {
        stockManager.register(listener); // 观察者激活时注册
    }
}

解析
采用观察者模式

  1. LifecycleOwner绑定生命周期
  2. 数据变更时通过postValue()通知Observer
  3. 自动处理界面不可见时的数据更新抑制

五、网络通信(15题)

例题8:Retrofit动态代理

public interface ApiService {
    @GET("user/{id}")
    Call<User> getUser(@Path("id") String id);
}

解析
核心流程:

  1. 通过Proxy.newProxyInstance()创建接口代理
  2. 解析注解生成ServiceMethod
  3. OkHttpCall封装网络请求
  4. 适配器模式支持RxJava/Coroutine

六、多线程(10题)

例题9:Handler内存泄漏

Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // 持有Activity引用
    }
};

解析
根本原因
Handler持有Activity隐式引用 → MessageQueue未释放 → GC不可达
解决方案

  • 静态内部类 + WeakReference
  • Activity销毁时调用handler.removeCallbacksAndMessages(null)

学习建议

  1. 实战训练:在Android Studio中复现问题场景
  2. 源码阅读:重点研究ActivityThreadViewRootImpl等核心类
  3. 调试工具
    • Systrace分析系统调用
    • StrictMode检测主线程IO
  4. 知识体系:建立脑图关联知识点(如Binder机制贯穿四大组件)

完整100题及代码示例获取:[GitHub仓库链接] | 推荐书籍:《Android开发艺术探索》《Kotlin实战》

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐