快手系列收官,这篇进入滴滴初级Android工程师面经。滴滴出行App大量使用Fragment导航、RecyclerView列表、本地存储等基础组件。初级岗面试重点考基础功是否扎实——API用法、常见坑、最佳实践。
今天8道题覆盖滴滴初级面试核心考点。
Q1:Fragment事务管理怎么用?add和replace区别?
FragmentTransaction:通过FragmentManager.beginTransaction()获取。常用操作:add(叠加Fragment)、replace(先移除再add)、remove、show/hide(不销毁View)、attach/detach。
add vs replace:add在容器上叠加(原来的还在),replace先移除所有再add新的。replace会触发被替换Fragment的onDestroyView。
addToBackStack:加入返回栈——按返回键回退到上一个Fragment。不加则直接退出Activity。
常见坑:commit在Activity状态保存后调用会崩溃。解决:用commitAllowingStateLoss或commitNow(同步提交,不能加BackStack)。
追问:Fragment通信怎么做?ViewModel共享(多个Fragment共用Activity的ViewModel)、接口回调(Fragment定义接口Activity实现)、EventBus(不推荐,隐式通信难追踪)。推荐ViewModel方式。
Q2:RecyclerView的缓存机制是什么?
四级缓存:Scrap(屏幕上正在显示的ViewHolder,detach后重新attach)、CachedViews(刚滑出屏幕的ViewHolder,默认缓存2个,按position精确匹配)、ViewCacheExtension(自定义缓存)、RecycledViewPool(按viewType缓存,默认每种5个,需重新bind)。
复用流程:先查Scrap(position匹配直接复用)→ 查CachedViews(position匹配直接复用,不需要bind)→ 查ViewCacheExtension → 查RecycledViewPool(viewType匹配,需要重新bind)→ 都没有则onCreateViewHolder。
追问:setHasFixedSize有什么用?告诉RecyclerView item的增删不会改变RecyclerView本身的大小,跳过requestLayout()重新测量,提升性能。列表item尺寸固定时务必设置。
Q3:RecyclerView的LayoutManager有哪些?
LinearLayoutManager:线性列表(纵向或横向)。setStackFromEnd从底部开始(聊天消息列表常用)。
GridLayoutManager:网格布局。setSpanCount设置列数,SpanSizeLookup让不同item占不同列数。
StaggeredGridLayoutManager:瀑布流布局,每个item高度不同,自动排列到最短列。
追问:RecyclerView和ListView区别?RecyclerView强制ViewHolder、支持多种LayoutManager、ItemAnimator和ItemDecoration解耦、局部刷新(notifyItemXxx)。
Q4:SharedPreferences有什么问题?有什么替代方案?
SP的问题:全量加载到内存(首次读取整个XML到Map,文件大时阻塞主线程)、commit同步写磁盘(阻塞调用线程)、apply异步写但可能ANR(Activity onPause时等待完成)、不支持跨进程、不支持类型检查。
替代方案:DataStore(Google官方推荐,Jetpack组件)。Preferences DataStore(键值对,类似SP但协程驱动、无全量加载问题)、Proto DataStore(Protocol Buffers序列化,类型安全、支持schema迁移)。MMKV(腾讯开源,mmap映射文件,读写速度远快于SP)。
追问:MMKV为什么快?基于mmap(内存映射文件),数据写入直接写到内存映射区域,由OS负责刷盘。不需要全量加载(按需读取),序列化用protobuf(比XML快)。支持多进程(文件锁机制)。
Q5:Fragment懒加载怎么实现?
场景:ViewPager + 多个Fragment,不希望切换tab时所有Fragment同时加载数据。
ViewPager2方案:默认懒加载(只创建当前页和相邻页)。设置OFFSCREEN_PAGE_LIMIT_OFF时只创建当前页。
ViewPager方案:setUserVisibleHint回调(Fragment可见时调用)。判断isVisibleToUser && isResumed时加载数据,需标记位避免重复加载。
追问:Fragment和Activity生命周期交错?Fragment的onCreate在Activity的onCreate中调用,onResume在Activity的onResume之后。onActivityCreated已废弃,用onViewCreated替代。
Q6:Toast在Android 11+有什么变化?
Android 11变化:自定义Toast视图被限制(setView只在应用前台生效,后台只显示文字Toast)。
替代方案:前台用Toast,后台通知用Notification,应用内提示用Snackbar。
Toast队列:LENGTH_SHORT约2秒,LENGTH_LONG约3.5秒。多个Toast排队显示。需要立即显示新Toast时先cancel旧的。
追问:Toast在子线程能弹吗?可以。Toast内部通过Handler在主线程Looper上显示。子线程使用需要Looper.prepare()或传主线程Handler。
Q7:DialogFragment比Dialog好在哪?
DialogFragment优势:生命周期跟随Fragment(Activity重建时自动恢复)、通过FragmentManager管理(事务、BackStack)、支持全屏Dialog。
普通Dialog问题:Activity重建后Dialog消失(需自己保存恢复)、泄漏风险(Dialog持有Activity Context,Activity销毁后还在显示会crash)。
BottomSheetDialogFragment:底部弹出面板(Material Design),通过BottomSheetBehavior控制展开/折叠。适合筛选面板、分享面板。
追问:Dialog和PopupWindow区别?Dialog有半透明遮罩(模态),PopupWindow没有(非模态)。PopupWindow更灵活(可指定位置大小),但需自己处理外部点击关闭。
Q8:滴滴初级Android面怎么准备?
重点复习:Fragment事务管理(add/replace/addToBackStack)、Fragment通信(ViewModel共享)、RecyclerView缓存机制(四级缓存)、LayoutManager选择、SharedPreferences问题和替代方案(DataStore/MMKV)、Fragment懒加载。
面试技巧:初级岗考基础扎实程度——不只是会用API,还要知道常见坑和最佳实践。比如"Fragment commit在onSaveInstanceState后崩溃怎么处理"、"RecyclerView setHasFixedSize的作用"。准备时多总结踩坑经验。
面试Tips:滴滴初级面考基础——Fragment事务管理和RecyclerView缓存机制是必考题。SharedPreferences问题和替代方案也高频。DialogFragment和Toast限制经常问。面试时能讲清楚API背后的原理和常见坑加分明显。
下一篇进入滴滴中级Android——MVP/MVVM对比、Dagger2依赖注入、Room数据库、WorkManager。
用过DataStore替代SharedPreferences的同学扣1,你觉得迁移过程最大的坑是什么?
本系列连载中,关注不迷路,下一篇:滴滴中级Android工程师面试真题
系列简介:Android大厂面经连载,覆盖字节跳动、腾讯、阿里、美团等40+企业,从初级到架构师全岗位覆盖。每篇文章包含真实面试题+详细答案+代码示例,帮你拿到大厂Offer。