2026-01-19 05:04:09
以下汇总了Android开发相关面试题,涵盖Java、Android基础、音视频、Flutter、算法、Framework及企业常见问题,并附案例解析。
主要注意点:
案例:通过Binder传递大图片时,若数据超过1M会触发TransactionTooLargeException。解决方案是将图片写入文件,传递文件路径至目标进程读取,或分块传输数据。
避免同时运行多个大数据事务。
大数据分块传输(如分多次发送图片数据块)。
按需加载数据,减少单次传输量。
案例:在跨进程传递视频流时,若直接传输整个视频帧数据,可能因单帧过大导致异常。可改为传输帧的元信息(如路径、偏移量),由目标进程按需读取。
将图片写入共享存储(如应用私有目录),传递路径至目标进程读取。
优点:无数据大小限制,稳定性高。
缺点:需处理文件权限和同步问题。
通过Intent的extras传递Bitmap,但可能因数据过大崩溃。
原因:Intent对附加数据大小有限制(通常约1M)。
使用Binder调用时,通过底层Ashmem(匿名共享内存)分配内存块传递数据。
适用场景:需要高性能且数据量适中的场景。
HashMap非线程安全,允许null键/值;HashTable线程安全,不允许null。
HashMap性能更高,HashTable因同步开销较大。
ArrayList基于动态数组,随机访问快;LinkedList基于链表,插入删除快。
核心线程数、最大线程数、存活时间、任务队列、拒绝策略。
互斥、占有且等待、非抢占、循环等待。需破坏任一条件预防死锁。
正常流程:onCreate → onStart → onResume → onPause → onStop → onDestroy。
横竖屏切换:触发onPause → onSaveInstanceState → onStop → onDestroy → onCreate(默认重建Activity)。
startService:长期运行,需手动停止。
bindService:与调用者绑定,调用者销毁时Service可能被解绑。
主线程阻塞(如耗时操作、死锁)。
BroadcastReceiver超时(默认10秒)。
使用异步任务(如AsyncTask、HandlerThread、RxJava)。
避免主线程I/O操作,使用子线程或缓存。
帧内压缩:利用空间冗余(如JPEG)。
帧间压缩:利用时间冗余(如H.264的I帧、P帧、B帧)。
减少首屏数据量(如降低分辨率、码率)。
预加载关键帧(GOP的第一个I帧)。
使用CDN就近分发,降低网络延迟。
Client:发起跨进程调用的一方。
Server:提供服务的一方。
ServiceManager:管理所有Service的注册与查询。
Client通过Binder驱动向Server发送请求。
Server处理请求后返回结果。
MessageQueue:存储待处理的Message。
Looper:循环取出Message并分发给Handler。
Handler:处理Message或发送新Message。
Looper.prepareMainLooper()创建主线程Looper。
Looper.loop()启动消息循环。
提前编译(AOT),应用安装时生成机器码,运行更快。
支持更高效的垃圾回收算法(如并发标记-清除)。
即时编译(JIT),运行时动态编译字节码。



以上内容覆盖了Android开发面试的核心知识点,建议结合实际项目经验深入理解,并针对性练习代码实现与问题排查能力。