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

下载本文档

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

文档简介

Android高频面试题及详细答案(实战版)一、Android基础核心面试题1.讲解Android四大组件及各自作用参考答案:Android四大组件是安卓应用的核心基础,分别是Activity、Service、BroadcastReceiver、ContentProvider,各司其职且相互配合。1.Activity(活动):应用的界面载体,负责和用户进行交互,展示页面、接收用户点击、滑动等操作。每个页面都是一个独立的Activity,拥有独立的生命周期,是用户感知最直接的组件。2.Service(服务):无界面的后台运行组件,用于处理耗时、后台持续运行的任务,比如后台播放音乐、文件下载、数据同步、保活任务等。分为前台服务和后台服务,前台服务会在通知栏展示,不易被系统回收。3.BroadcastReceiver(广播接收器):全局消息监听组件,用于接收系统或应用自定义的广播消息,实现跨组件、跨应用通信。常见场景:监听网络切换、电量变化、开机启动、APP推送消息接收等。分为静态注册和动态注册两种方式。4.ContentProvider(内容提供者):跨应用数据共享组件,负责管理应用私有数据,对外提供统一的数据访问接口,实现不同APP之间的数据读写。系统自带的通讯录、相册、短信数据都是通过该组件对外暴露访问的。2.详细说说Activity生命周期,以及各个方法的作用参考答案:Activity生命周期是页面从创建、显示、运行、暂停、销毁的完整过程,核心七个生命周期方法,对应不同页面状态:1.onCreate():页面首次创建时调用,仅执行一次。主要用于初始化布局、控件、数据、适配器,是页面初始化的核心方法。2.onStart():页面从不可见变为可见,但无法获取焦点。执行多次,页面返回、后台切换前台都会触发,仅做页面可见相关初始化,不做耗时操作。3.onResume():页面获取焦点,处于可交互状态,正常运行。用户可以点击、滑动页面,日常页面操作都在该状态下,频繁触发,不建议初始化大量数据。4.onPause():页面失去焦点,进入暂停状态。弹窗、页面半遮挡、切换页面时触发,需要在这里保存临时数据、停止动画、暂停视频播放。5.onStop():页面完全不可见,进入停止状态。页面跳转、APP退到后台触发,资源占用较多,需要释放大量资源,停止网络请求、关闭耗时线程。6.onRestart():页面从后台重新切换回前台、从不可见变为可见前触发,执行多次,用于恢复页面数据和状态。7.onDestroy():页面销毁时调用,仅执行一次。彻底释放所有资源,关闭数据库、解绑广播、销毁线程、释放控件引用,防止内存泄漏。3.Activity四种启动模式及实际应用场景参考答案:Activity启动模式用于控制任务栈中页面的实例数量和复用规则,四种模式如下:1.standard(标准模式,默认):每次启动都会创建全新实例,无论栈中是否存在该页面。适用于消息列表、详情页等可重复打开的页面。2.singleTop(栈顶复用):如果目标页面在任务栈栈顶,直接复用实例,触发onNewIntent,不新建页面;不在栈顶则新建实例。适用于首页、搜索页,防止重复打开同一页面。3.singleTask(栈内复用):整个任务栈内仅保留一个实例,栈中存在该页面则复用,同时清空该页面上方所有页面。适用于首页、登录页,跳转后清空中间页面,返回直接退出。4.singleInstance(单例模式):独立开辟全新任务栈,全局唯一实例,单独占用一个栈。适用于系统弹窗、悬浮窗、来电页面等独立页面。4.说说Activity横竖屏切换的生命周期变化参考答案:默认情况下,横竖屏切换会触发页面销毁重建,生命周期执行顺序:onPause->onStop->onDestroy->onCreate->onStart->onResume。原因是横竖屏布局尺寸、资源文件不同,系统会自动加载对应布局资源,重建页面。解决方案避免重建:在清单文件Activity节点配置android:configChanges="orientation|screenSize",配置后切换屏幕不会销毁重建,只会触发onConfigurationChanged方法,可在该方法中手动适配布局和数据。5.什么是Intent,显式Intent和隐式Intent的区别参考答案:Intent是安卓组件通信的信使,用于跳转页面、启动服务、发送广播、传递数据,是组件间交互的核心媒介。1.显式Intent:直接指定目标组件的类名,精准跳转,针对性强。日常页面跳转、启动服务基本都用显式Intent,效率高。示例:newIntent(MainActivity.this,SecondActivity.class)2.隐式Intent:不指定具体目标类,通过action、category、data匹配系统或自定义组件,常用于调用系统功能,比如打开网页、拨打电话、打开图片。优势是解耦,无需指定具体组件。二、Android布局与控件面试题1.常用布局优缺点及使用场景参考答案:1.LinearLayout(线性布局)优点:结构简单、排版清晰,支持权重分割布局,适配简单横向、纵向排列场景;缺点:嵌套层级过多会导致页面渲染卡顿,无法叠加布局。适用于简单列表条目、顶部导航、按钮排列。2.RelativeLayout(相对布局)优点:减少布局嵌套,通过控件相对位置排版;缺点:渲染测量效率低,规则复杂,适配成本高。目前基本被ConstraintLayout替代。3.ConstraintLayout(约束布局)优点:扁平化布局,无嵌套,渲染速度快,支持比例、居中、偏移、barrier等高级适配,适配屏幕兼容性极强;缺点:新手上手稍复杂。是目前项目主流布局,适用于所有复杂页面。4.FrameLayout(帧布局)优点:层级简单,控件默认置顶叠加,渲染速度最快;缺点:排版单一,仅适合叠加场景。适用于弹窗、轮播图、加载进度层、标题栏。2.View和ViewGroup的区别参考答案:1.View:所有控件的基类,是单个视图单元,无法包含子控件。比如TextView、Button、ImageView,负责自身绘制、点击事件、手势处理。2.ViewGroup:View的子类,是容器布局,可以包含多个子View或子ViewGroup,负责管理子控件的测量、布局、绘制。比如ConstraintLayout、LinearLayout都属于ViewGroup。简单总结:View是控件,ViewGroup是承载控件的容器。3.View的绘制流程参考答案:View完整绘制流程分为三步:测量、布局、绘制,从根布局逐层向下传递。1.measure(测量):调用onMeasure方法,根据父容器约束、控件属性,测量出View的宽高尺寸,保存测量宽高。2.layout(布局):调用onLayout方法,父容器根据测量结果,确定View在屏幕中的位置和最终宽高。ViewGroup会遍历所有子控件,完成子控件布局。3.draw(绘制):调用onDraw方法,通过画布Canvas绘制控件内容,包括背景、文字、图片、自定义图形,最终渲染到屏幕。三、Android性能优化面试题(高频)1.什么是内存泄漏?安卓常见内存泄漏场景及解决方案参考答案:内存泄漏指程序运行中,无用对象持续持有内存资源,系统无法回收,导致内存占用越来越高,最终引发卡顿、OOM崩溃。核心原因:长生命周期对象持有短生命周期对象的引用,导致短对象无法被GC回收。常见场景及解决方案:1.静态Activity/View引用:静态变量生命周期等同于应用进程,会持有页面引用,页面退出无法回收。解决方案:避免静态持有控件、页面引用。2.匿名内部类、Handler泄漏:Handler匿名内部类默认持有外部Activity引用,延迟消息未处理时,页面销毁无法回收。解决方案:使用静态Handler+弱引用,页面销毁移除所有消息。3.线程、异步任务泄漏:子线程耗时操作未结束,页面销毁,线程持有页面引用。解决方案:页面销毁终止线程、取消异步任务。4.广播、观察者未解绑:注册广播、事件监听后,页面销毁未解绑,系统持续持有引用。解决方案:onDestroy中统一解绑、注销监听。5.集合未清空数据:全局集合持续添加数据,不主动清空。解决方案:页面销毁、页面退出清空集合。2.ListView卡顿原因及优化方案,对比RecyclerView优势参考答案:ListView卡顿原因:1.频繁调用getView,每次滑动都会重复创建View、findViewById,造成大量IO和渲染耗时;2.无视图复用机制优化,滑动过程频繁GC;3.无法预加载、缓存机制薄弱。ListView优化方案:1.使用ViewHolder复用控件,避免重复findViewById;2.异步加载图片、数据,主线程只做展示;3.分页加载,减少一次性数据量;4.滑动时暂停图片加载,停止滑动再恢复。RecyclerView相比ListView优势:1.自带视图复用、缓存机制,三级缓存,滑动更流畅;2.支持布局管理器,轻松实现列表、网格、瀑布流;3.支持Item动画、局部刷新,无需全局刷新;4.解耦性更强,适配代码更规范,扩展性更高。3.APP启动速度优化方案参考答案:1.主线程优化:Application、SplashActivity中杜绝耗时操作,网络请求、数据库初始化、第三方SDK初始化全部放入子线程。2.任务拆分与延迟初始化:非核心功能、非必要SDK延迟初始化,页面渲染完成后再异步加载。3.布局优化:减少布局嵌套,使用ConstraintLayout,删除无用控件、冗余资源,减少页面渲染耗时。4.资源优化:压缩图片、剔除无用资源文件,减少打包体积和加载耗时。5.任务并行:启动多个子线程并行处理初始化任务,缩短整体启动耗时。四、网络与数据存储面试题1.Android常用数据存储方式及区别参考答案:1.SharedPreferences:轻量级键值对存储,以XML文件保存数据。适用于存储配置信息、登录状态、开关设置等少量简单数据。缺点:不支持大数据、不支持复杂对象、跨进程读写有延迟。2.文件存储:直接读写本地txt、json、图片等文件。适用于缓存文件、日志、本地资源保存,灵活性高,读写速度快。3.SQLite数据库:轻量级本地关系型数据库,支持增删改查、事务、索引。适用于大量结构化数据存储,比如本地列表数据、聊天记录。4.ContentProvider:跨应用数据共享存储,用于对外暴露数据,实现不同APP数据互通。2.OkHttp、Retrofit的区别与工作原理参考答案:1.OkHttp:底层网络请求框架,负责真正的网络请求、响应处理,支持连接池、缓存、超时重连、拦截器,是安卓主流底层网络请求工具。2.Retrofit:基于OkHttp封装的上层框架,简化网络请求写法,通过注解配置请求方式、参数、地址,自动解析返回数据,解耦性强、代码简洁、易于维护。简单总结:OkHttp负责干活,Retrofit负责封装、规范代码。3.网络请求为什么要在子线程?主线程请求会怎样?参考答案:网络请求属于耗时操作,网络连接、数据传输会产生几百毫秒甚至数秒延迟。1.主线程负责UI渲染、用户交互,主线程执行耗时操作会阻塞UI,导致页面卡顿、ANR应用无响应;2.安卓高版本系统直接禁止主线程网络请求,会直接抛出异常崩溃。所以所有网络请求、文件读写、数据库操作等耗时任务,必须放在子线程执行,通过主线程更新UI。五、Handler消息机制高频面试题1.详细讲解Handler、Message、MessageQueue、Looper机制参考答案:Handler消息机制是安卓主线程UI更新的核心机制,解决子线程无法更新UI的问题,四大核心组件配合工作:1.Message:消息载体,携带what、arg1、arg2、obj数据,用于传递信息。2.MessageQueue:消息队列,底层是单链表结构,存储所有发送的Message,先进先出,等待被处理。3.Looper:消息循环器,每个线程唯一对应一个Looper。无限循环从MessageQueue中取出消息,分发到对应Handler处理。主线程默认自带Looper,子线程需要手动创建、启动。4.Handler:消息发送和处理工具,子线程通过Handler发送消息到队列,主线程接收消息、处理消息、更新UI。整体流程:子线程Handler.sendMessage->消息存入MessageQueue->Looper循环取出消息->Handler.handleMessage处理消息->主线程更新UI。2.为什么子线程不能更新UI?参考答案:安卓UI控件不是线程安全的,如果多线程同时操作同一个控件,会导致UI状态错乱、画面闪烁、控件异常。系统设计为单线程UI模型,只允许主线程操作UI,保证界面绘制、更新的有序性和稳定性,避免多线程并发冲突。所有子线程的更新操作,必须通过Handler切换到主线程执行。六、进阶高频面试题1.ANR是什么?触发场景及解决方案参考答案:ANR即应用无响应,主线程阻塞超时,系统判定应用卡死,弹出等

温馨提示

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

评论

0/150

提交评论