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

下载本文档

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

文档简介

Android应用开发面试题及详细答案(实战版)一、Android基础核心面试题1.讲解Android四大组件及其核心作用参考答案:Android四大组件是App运行的核心基础,各自职责独立、相互配合,具体如下:Activity:页面载体,负责界面展示、用户交互,是用户能直观看到的页面,所有UI操作、页面跳转都依托Activity完成,每个独立页面基本对应一个Activity。Service:后台服务,无界面,专门用于处理后台耗时任务,比如音乐播放、文件下载、后台定位、数据同步,可在页面退出后继续运行,不占用前台界面资源。BroadcastReceiver(广播接收器):全局消息通信组件,用于接收系统或App自定义的广播消息,实现跨组件、跨应用通信。常见场景:监听网络切换、电量变化、开机启动、APP内部页面消息通知。ContentProvider(内容提供者):数据共享组件,主要实现跨应用数据读写与共享,统一数据访问接口,保障数据安全。系统通讯录、相册、短信数据都是通过该组件对外提供访问,开发者也可自定义实现App内部数据共享。2.详细说说Activity生命周期及各方法场景参考答案:Activity生命周期是页面从创建、显示、交互、暂停到销毁的完整流程,核心七个方法,对应不同业务场景:onCreate():页面首次创建时调用,只执行一次。主要做初始化操作,比如初始化布局、控件、数据、适配器、全局参数。onStart():页面可见但未获取焦点,无法交互。适合初始化页面需要展示的静态数据、注册普通监听。onResume():页面完全可见、获取焦点,可正常交互。每次页面回到前台都会执行,适合刷新页面数据、开启动画、启动前台任务。onPause():页面失去焦点、部分遮挡,暂停交互。需要及时保存临时数据、停止动画、暂停耗时操作,避免资源浪费。onStop():页面完全不可见,后台运行。释放大量资源,比如停止网络请求、关闭视频播放、注销部分监听。onRestart():页面从后台重新回到前台时触发,不新建页面。配合onStop完成资源重新初始化。onDestroy():页面销毁,只执行一次。彻底释放所有资源,解绑控件、取消网络请求、关闭线程、释放内存,防止内存泄漏。3.Activity横竖屏切换生命周期变化及解决方案参考答案:默认情况下,横竖屏切换会销毁当前Activity,重新创建,完整执行onPause->onStop->onDestroy->onCreate->onStart->onResume流程,会导致页面数据、状态丢失。解决方案:1.固定屏幕方向:在清单文件对应Activity配置android:screenOrientation="portrait"(竖屏)/landscape(横屏),彻底避免重建;2.配置页面状态不重建:配置android:configChanges="orientation|screenSize|keyboardHidden",切换屏幕时不会触发销毁重建,只会回调onConfigurationChanged方法,可手动适配界面布局;3.数据保存恢复:重写onSaveInstanceState保存临时数据,onRestoreInstanceState恢复数据,适配少量状态数据留存场景。4.任务栈的理解,Activity四种启动模式区别参考答案:任务栈是系统用来存储Activity实例的栈结构,遵循先进后出规则,控制页面的跳转、返回、销毁逻辑。四种启动模式用于适配不同页面复用场景:standard(默认):每次启动都会新建全新实例,无论栈中是否存在该页面,会导致栈内大量重复页面,适合详情页、临时弹窗页面。singleTop:栈顶复用模式。如果目标页面在栈顶,直接复用,不新建,回调onNewIntent;不在栈顶则新建实例。适合首页、搜索页,避免重复打开同一顶页面。singleTask:栈内复用模式。栈内存在目标页面,直接复用,并清空该页面上方所有Activity,让其置于栈顶;不存在则新建。适合首页、登录页、主页面,防止多层页面堆叠。singleInstance:单例栈模式。单独开辟一个全新任务栈,该页面唯一独占一个栈,全局只有一个实例。适合弹窗、系统级页面、独立展示页面。二、Service、广播与进程面试题1.Service两种启动方式、区别及适用场景参考答案:Service分为startService和bindService两种启动方式,核心区别在于生命周期和通信能力:startService启动:通过startIntent启动,生命周期独立,启动后和启动组件解绑,页面关闭后Service仍可后台运行。生命周期:onCreate->onStartCommand->onDestroy。无法和页面实时通信,适合纯后台任务,如下载、同步数据、后台播放。bindService启动:通过bindIntent绑定,和绑定组件生命周期绑定,组件销毁,Service自动解绑销毁。可通过IBinder实现页面和Service双向实时通信,适合需要交互的后台服务,如音乐播放控制、进度实时回调。实际开发常混合使用,既保证后台常驻,又支持页面交互。2.前台Service和后台Service区别,保活方案参考答案:后台Service优先级低,系统内存不足时会优先回收,容易被杀;前台Service会在通知栏展示常驻通知,优先级极高,系统默认不会主动回收,适配后台常驻需求。常用保活方案(合规常规方案):1.将Service设置为前台服务,展示常驻通知,提升优先级;2.开启守护进程、双进程互相唤醒(适配旧机型,新版系统限制严格);3.监听系统广播,服务被杀死后自动重启;4.适配系统电池白名单、后台运行权限,引导用户手动开启权限。3.静态广播和动态广播的区别参考答案:静态广播:在清单文件中注册,App未启动、进程未存活时也能接收系统广播,常驻生效。缺点是全局监听,功耗略高,Android8.0后大量静态广播被废弃,仅支持少量系统指定广播。动态广播:代码中注册、解绑,跟随组件生命周期,页面销毁及时解绑,功耗低、灵活性高。App退出后无法接收广播,适合App运行期间的消息监听,是目前主流使用方式。三、Android性能优化与内存面试题(高频)1.什么是内存泄漏?Android常见内存泄漏场景及解决参考答案:内存泄漏是指程序中已不再使用的对象,被其他长生命周期对象持续持有引用,导致GC无法回收,长期堆积造成内存占用过高、卡顿、闪退。常见场景及解决方案:1.静态持有Activity/Context:静态变量生命周期大于页面,会持有页面引用无法回收。解决方案:使用Application的Context,避免静态持有页面、控件。2.匿名内部类、Handler泄漏:内部类默认持有外部类引用,延时消息未处理完会阻塞页面销毁。解决方案:使用静态内部类+弱引用,页面销毁时移除所有消息。3.资源未释放:广播、监听、数据库、动画、流资源未关闭解绑。解决方案:在onDestroy统一解绑、关闭、释放资源。4.集合未清空数据:列表、缓存集合持续添加数据不清理。解决方案:页面销毁清空集合,按需复用对象。5.单例持有页面引用:单例全局常驻,持有页面会导致页面无法回收。解决方案:使用全局Context,避免传入页面实例。2.Android卡顿原理及UI优化方案参考答案:AndroidUI刷新依赖主线程,系统默认16ms刷新一帧,主线程如果存在耗时操作(网络请求、大量计算、IO操作),超过16ms就会丢帧,产生卡顿、界面滑动不流畅。UI优化方案:1.主线程只做UI刷新,所有耗时操作(网络、解析、IO、计算)全部放入子线程;2.优化布局层级,减少嵌套,使用ConstraintLayout替代多层LinearLayout、RelativeLayout,减少布局测量绘制耗时;3.减少过度绘制,去除多余背景、重叠颜色,开启GPU过度绘制检测优化;4.列表优化:复用Item布局,减少findViewById,使用ViewHolder、RecyclerView预加载,分页加载数据,避免一次性加载大量数据;5.延迟初始化非核心控件、任务,页面展示优先加载核心内容;6.避免频繁刷新UI,合并多次UI更新操作。3.简述GC机制、MinorGC和FullGC区别参考答案:GC是虚拟机的垃圾回收机制,自动回收无引用的闲置对象内存,无需手动操作。MinorGC:针对新生代内存回收,频率高、速度快,耗时短,对界面影响极小,主要回收短期创建的临时对象。FullGC:针对全内存(新生代+老年代)回收,耗时久、会阻塞主线程,频繁FullGC会直接导致卡顿、OOM。多由内存泄漏、对象大量创建、内存溢出引发,开发中需要重点规避。4.OOM内存溢出常见原因与解决思路参考答案:OOM是应用申请的内存超出系统分配的最大内存上限,导致程序崩溃。常见原因:内存泄漏长期堆积、图片未压缩直接加载、一次性加载超大资源、无限创建对象、递归死循环。解决思路:1.使用Glide、Coil等图片框架,自动压缩、缓存、复用图片资源;2.图片按需加载,设置采样率,避免加载原图;3.排查并修复所有内存泄漏问题,及时释放资源;4.分页加载列表、数据,避免一次性加载海量数据;5.大对象使用完及时置空,辅助GC回收。四、网络与异步面试题1.主线程为什么不能进行网络请求?如何解决参考答案:网络请求属于耗时操作,耗时不确定,主线程执行会阻塞UI刷新,造成页面卡顿、ANR闪退。从Android4.0开始,系统直接禁止主线程网络请求,会抛出异常。解决方案:通过子线程执行网络请求,常用方式:Thread、Handler、AsyncTask、RxJava、Coroutine协程、WorkManager。子线程完成请求后,切回主线程更新UI。2.OkHttp、Retrofit核心原理与优势参考答案:OkHttp:底层网络请求框架,负责真实的网络请求调度,支持连接池复用、请求拦截、缓存、超时重试、HTTPS适配。核心优势是连接池减少重复创建连接的开销,请求稳定、容错性高,是主流网络底层框架。Retrofit:基于OkHttp的封装框架,通过注解方式配置接口、请求方式、参数,无需手写大量请求代码,支持动态代理生成请求实例,适配RxJava、协程。优势是代码简洁、易维护、接口统一、便于统一管理请求和拦截器。3.网络拦截器的使用场景与责任链模式参考答案:Retrofit+OkHttp的拦截器采用责任链模式,多个拦截器层层传递请求、响应数据。常用场景:统一添加请求头、统一Token携带、请求参数加密、响应数据解密、日志打印、异常统一处理、缓存拦截、超时统一配置。分为应用拦截器和网络拦截器,应用拦截器优先处理业务参数,网络拦截器处理网络层通用逻辑。4.协程的优势、使用场景,和RxJava对比参考答案:协程是轻量级异步任务框架,开销远小于线程,无需频繁创建销毁线程,代码同步式书写,可读性强,原生支持生命周期感知,可自动取消任务,避免泄漏。使用场景:网络请求、异步任务串行/并行执行、延时任务、页面数据刷新。对比RxJava:协程语法更简洁、学习成本低、系统原生支持、无第三方依赖臃肿问题;RxJava操作符丰富,适合复杂数据流切换,但是学习成本高、内存泄漏风险高、代码晦涩。目前主流项目逐步用协程替代RxJava。五、自定义View与UI面试题1.自定义View三大绘制流程参考答案:自定义View绘制核心三步,从上到下依次执行:测量onMeasure():测量控件自身宽高,根据父容器约束、布局参数计算最终尺寸,处理wrap_content、match_parent、固定尺寸逻辑。布局onLayout():确定控件在父容器中的位置,遍历子View,分配子控件位置和大小。绘制onDraw():通过Canvas画布绘制文字、图形、图片、渐变等自定义样式,是自定义UI的核心方法。2.invalidate()和requestLayout()区别参考答案:invalidate():只触发onDraw绘制,不重新测量、布局,仅刷新UI样式,适合颜色、图片、文字变化刷新,效率高。requestLayout():重新触发测量、布局、绘制完整流程,控件尺寸、位置发生变化时使用,开销更大。3.事件分发机制原理(Touch事件)参考答案:Touch事件分发遵循从上到下分发,从下到上消费规则,核心三个方法:dispatchTouchEvent():分发事件,决定是否向下传递子View;onInterceptTouchEvent():ViewGroup专属,拦截事件,拦截后不再向下传递,自己处理;onTouchEvent():消费事件,返回true表示消费,事件终止;返回false表示不消费,向上回传给父控件。常见场景解决滑动冲突,通过事件拦截、按需消费解决内外层滑动冲突问题。六、Android进阶与工程化面试题1.浅谈Activity启动流程参考答案:1.应用通过Context发起startActivity请求;2.AMS(活动管理服务)接收请求,校验权限、任务栈、启动模式;3.AMS通知应用进程,通过Binder跨进程通信回调;4.主线程Handler接收消息,触发Activity实例创建;5.依次执行Activity生命周期方法,加载布局、初始化UI,完成页面展示。2.Binder机制的作用与理解参考答案:Binder是Android核心跨进程通信机制,区别于Linux的Socket、管道,效率更高、开销更小。系统各大服务(AMS、WMS、PMS)都是通过Binder和应用进程通信。核心作用:实现不同进程间的数据传递

温馨提示

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

评论

0/150

提交评论