Android 高频面试题及详细答案(真实职场版)_第1页
Android 高频面试题及详细答案(真实职场版)_第2页
Android 高频面试题及详细答案(真实职场版)_第3页
Android 高频面试题及详细答案(真实职场版)_第4页
Android 高频面试题及详细答案(真实职场版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android高频面试题及详细答案(真实职场版)一、Android基础核心面试题1、简述Android系统四大组件及各自作用四大组件是Android应用的核心基础,缺一不可,各自职责独立,相互配合完成应用功能,具体作用如下:Activity(活动):是应用的页面载体,负责展示界面、接收用户操作交互,是用户能直观看到的页面。每一个独立页面都对应一个Activity,所有界面跳转、页面生命周期管理都依托Activity完成。Service(服务):运行在后台的组件,无界面,主要用于处理耗时、常驻后台的任务,比如后台播放音乐、文件下载、数据同步、保活任务等,不依赖页面展示,即使页面退出也可继续运行。BroadcastReceiver(广播接收器):全局消息订阅组件,用于接收系统或应用自定义的广播消息,实现跨组件、跨应用通信。常见场景:监听手机开机、网络状态变化、电量过低、APP推送消息、自定义页面通信等。ContentProvider(内容提供者):跨应用数据共享组件,主要用于对外暴露本应用数据,或读取其他应用的共享数据,保证数据访问的安全性和规范性。系统自带的通讯录、相册、短信数据都是通过该组件对外提供访问的。2、详细说说Activity完整生命周期及各方法场景Activity生命周期是页面从创建、显示、交互、暂停、销毁的完整过程,核心7个方法,对应不同页面状态,实际开发中高频用到:onCreate():页面首次创建时调用,只执行一次。主要用于初始化布局、控件、数据、适配器,是页面初始化的核心方法。onStart():页面从不可见变为可见,但还无法交互。多次触发,比如页面从后台返回、跳转新页面返回当前页都会执行。onResume():页面获取焦点,可正常和用户交互,处于前台运行状态。所有页面交互、动画、定时器恢复都在这里处理。onPause():页面失去焦点,暂停交互。比如弹出弹窗、跳转半透明页面、切后台瞬间触发。需要在这里暂停动画、定时器、视频播放,保存临时数据。onStop():页面完全不可见,后台运行。比如完全跳转新页面、应用退到后台。需要释放大量资源,比如停止网络请求、释放播放器资源。onRestart():页面从后台重新回到前台、未销毁状态触发,不会新建页面,只做页面重启恢复。onDestroy():页面销毁,只执行一次。彻底释放所有资源,取消网络请求、解绑监听、关闭数据库、释放线程,防止内存泄漏。完整流程:新建页面→onCreate→onStart→onResume;页面退后台→onPause→onStop;页面返回前台→onRestart→onStart→onResume;页面关闭→onPause→onStop→onDestroy。3、Activity横竖屏切换生命周期怎么走?如何避免页面重建?默认生命周期:横竖屏切换时,系统会销毁当前Activity,再重新创建,流程为:onPause→onStop→onDestroy→onCreate→onStart→onResume。这也是切换屏幕时页面数据丢失、页面刷新的原因。避免页面重建的方案:1、清单文件中给Activity配置android:configChanges="orientation|screenSize|keyboardHidden",配置后横竖屏切换不会触发页面重建,只会回调onConfigurationChanged方法,可在该方法中手动适配布局。2、通过onSaveInstanceState保存临时数据,onRestoreInstanceState恢复数据,适配未配置configChanges的场景,防止数据丢失。4、Activity四种启动模式及实际使用场景standard(标准模式,默认):每次启动都会新建一个Activity实例,不管任务栈中是否存在该页面。适用于首页、详情页等无重复限制的页面。singleTop(栈顶复用):如果当前页面在任务栈栈顶,直接复用,不会新建实例,回调onNewIntent;如果不在栈顶,依然新建。适用于通知跳转页面、登录页,避免重复打开同一页面。singleTask(栈内复用):整个任务栈内只存在一个该页面实例,启动时会清空该页面上方所有Activity,让当前页面置顶。适用于首页、主界面、购物车主页,防止多层页面堆叠。singleInstance(单例模式):单独开启一个独立任务栈,全局唯一实例,独占栈结构。适用于系统级弹窗页面、悬浮窗页面、锁屏页面,极少用于普通业务页面。二、Fragment核心面试题1、Fragment生命周期及和Activity的联动关系Fragment是依附于Activity的碎片页面,生命周期比Activity更细致,核心方法除基础的onCreate、onStart、onResume外,独有:onAttach:Fragment绑定Activity时触发onCreateView:创建Fragment布局视图onViewCreated:视图创建完成,初始化控件核心方法onDetach:解除与Activity的绑定联动关系:Activity的生命周期会直接影响Fragment。Activity执行onResume时,所有可见Fragment同步onResume;Activity销毁时,所有依附的Fragment同步销毁。Fragment不能独立存在,必须嵌入Activity。2、Fragment重叠问题原因及解决方案原因:页面重建(横竖屏切换、系统内存回收)时,系统会自动恢复之前的Fragment实例,而代码中又会重新add一次Fragment,导致新旧Fragment叠加,出现重叠。解决方案:1、重建页面时,先判断Fragment是否已经存在,通过findFragmentByTag查找,存在则复用,不再重新创建;2、使用replace代替add,replace会先移除原有Fragment再添加,避免堆叠;3、不保留Activity重建状态,清单配置android:retainInstance="false"。三、Android数据存储面试题1、Android五种数据存储方式及适用场景SharedPreferences:轻量级键值对存储,存储少量简单数据(字符串、数字、布尔值)。适用场景:保存登录状态、用户配置、主题设置、缓存开关状态。不适合存储大量数据,读写效率低。SQLite数据库:轻量级关系型数据库,支持增删改查、事务、索引。适用场景:存储大量结构化数据,如本地聊天记录、商品列表、本地缓存数据。文件存储:分为内部存储、外部存储。内部存储私有、安全,仅本应用访问;外部存储可共享。适用场景:保存图片、日志、缓存文件、自定义文本数据。ContentProvider:跨应用数据共享存储,用于对外暴露数据,不做本地存储。网络存储:数据存储在服务器,通过接口读写,适用于所有需要同步云端的数据。2、SharedPreferences优缺点及注意事项优点:使用简单、轻量、无需手动创建文件,系统自动管理,适合配置类数据持久化。缺点:不支持大数据存储、不支持事务、多线程读写有并发问题、频繁读写容易卡顿、全量写入,修改单个key会重写整个文件。注意事项:禁止存储大量数据;避免主线程频繁调用apply/commit;apply异步无返回,commit同步有返回、容易阻塞主线程;不适合存储敏感数据,可被root设备读取。四、Android网络编程面试题1、OkHttp核心原理及优势OkHttp是Android主流网络请求框架,基于Http/Http2协议,核心封装了网络请求的连接、缓存、重试、拦截逻辑。核心优势:1、支持连接池复用,减少频繁创建销毁连接的开销,提升请求速度;2、自带请求重试、重定向、超时机制,适配弱网、异常网络场景;3、支持拦截器,可统一处理请求头、日志、加密、token校验;4、支持Http2、WebSocket,支持长连接、流式数据传输;5、支持手动缓存、离线缓存,适配无网场景数据展示。2、Retrofit工作原理Retrofit是基于OkHttp封装的注解式网络框架,本质是对OkHttp的上层封装,不负责底层网络请求,只做请求参数解析、接口封装、数据解析。核心原理:1、通过动态代理生成网络接口的实现类;2、解析接口上的注解(GET、POST、URL、参数),拼接成完整请求体;3、交由OkHttp完成底层网络请求;4、通过转换器(Gson、FastJson)将返回的流数据解析为实体类。3、Android主线程不能请求网络的原因及解决方案原因:网络请求属于耗时操作,主线程负责UI绘制和交互。主线程请求网络会阻塞UI线程,导致页面卡顿、ANR(应用无响应),因此系统直接禁止主线程网络请求。解决方案:通过子线程执行网络请求,常用方式:线程池、AsyncTask、RxJava、Coroutine协程、OkHttp/Retrofit自带异步请求。五、性能优化&内存泄漏面试题1、什么是内存泄漏?Android常见内存泄漏场景及修复内存泄漏定义:程序中已无用的对象,被其他长生命周期对象持续引用,导致垃圾回收器无法回收,长期堆积导致内存占用过高、卡顿、闪退。常见场景及修复:1、静态Activity/View引用:静态变量生命周期大于页面,导致页面无法回收。修复:杜绝静态引用页面、控件。2、匿名内部类、Handler泄漏:匿名内部类默认持有外部类引用,延时消息未处理完会导致页面泄漏。修复:使用静态Handler+弱引用,页面销毁移除所有消息。3、线程、协程未取消:页面销毁后子线程仍在运行,持有页面引用。修复:onDestroy中取消线程、协程任务。4、广播、监听未解绑:页面销毁未注销广播、未移除点击监听、数据流监听。修复:页面生命周期成对绑定解绑。5、单例持有页面引用:单例全局常驻,持有页面实例导致无法回收。修复:单例只持有应用上下文,不持有页面上下文。2、WeakReference弱引用作用及使用场景弱引用的对象,不会阻碍垃圾回收,系统GC时会直接回收弱引用对象,主要用于解决内存泄漏。常用场景:静态Handler引用Activity、缓存临时数据、防止长生命周期对象持有短生命周期对象引用。3、APP卡顿优化常用方案卡顿核心原因:主线程耗时操作、UI绘制冗余、内存抖动。优化方案:1、主线程只做UI刷新,所有耗时操作(网络、文件、数据库、解析数据)全部放入子线程;2、优化布局层级,减少嵌套,使用Merge、ViewStub懒加载布局;3、减少频繁创建对象,避免内存抖动,复用集合、控件、适配器;4、优化RecyclerView滑动卡顿,减少onBind耗时,复用ViewHolder,预加载数据;5、避免主线程频繁IO、SP读写;6、使用卡顿检测工具(BlockCanary)定位耗时代码。六、Android进阶核心面试题1、Context上下文区别(Application、Activity、Service)ApplicationContext:全局唯一,生命周期等于应用进程,全局通用,适合获取全局资源、单例使用,不能创建弹窗、启动页面。ActivityContext:依附页面,生命周期随页面,可创建弹窗、启动页面、操作UI,页面销毁后失效。ServiceContext:依附服务,无UI权限,仅用于业务逻辑、资源获取。核心注意点:避免用ActivityContext做全局静态引用,防止内存泄漏;全局场景优先使用ApplicationContext。2、ANR是什么?触发场景及规避方案ANR(应用无响应):主线程阻塞超时,系统判定应用卡死,弹出无响应弹窗。触发场景:1、Activity5s内未响应点击、触摸事件;2、BroadcastReceiver10s内未执行完成;3、Service20s内未执行完成。规避方案:所有耗时操作移至子线程;广播、服务中不做耗时逻辑;主线程减少循环、IO、复杂计算。3、RecyclerView复用原理及优化点复用原理:RecyclerView维护三级缓存(ViewCacheExtension、RecyclerViewPool、ViewHolder缓存),滑动列表时,划出屏幕的ViewHolder不会销毁,存入缓存,新进入屏幕的Item直接复用缓存ViewHolder,无需重复创建布局、初始化控件,大幅提升滑动效率。常用优化:1、设置固定宽高setHasFixedSize(true),避免频繁测量布局;2、分页加载、预加载数据,一次性不加载过多数据;3、优化onBindViewHolder,减少耗时逻辑、避免频繁new对象;4、开启diffUtil差分刷新,局部更新数据,不全局刷

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论