2025年高频京东android面试题及答案_第1页
2025年高频京东android面试题及答案_第2页
2025年高频京东android面试题及答案_第3页
2025年高频京东android面试题及答案_第4页
2025年高频京东android面试题及答案_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

2025年高频京东android面试题及答案Activity生命周期中,当屏幕旋转时会经历哪些阶段?若要避免重建,需如何操作?屏幕旋转属于配置变更,默认情况下Activity会销毁并重建,完整生命周期为:onPause→onStop→onDestroy→onCreate→onStart→onResume。若需避免重建,可在AndroidManifest.xml中为Activity添加configChanges属性,指定“orientation|screenSize”(API13+需包含screenSize),此时系统会调用onConfigurationChanged方法而非重建Activity。需注意,仅当配置变更在指定范围内时生效,如旋转导致的DPI变化未被包含时仍会重建。View的事件分发机制中,dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent的调用顺序是怎样的?返回值如何影响流程?事件分发遵循“从父到子,从子到父”的传递链。顶层ViewGroup接收到事件后,先调用自身dispatchTouchEvent,内部调用onInterceptTouchEvent判断是否拦截。若拦截(返回true),则事件由当前ViewGroup处理,调用自身onTouchEvent;若不拦截(返回false或super),事件传递给子View的dispatchTouchEvent。子View若为ViewGroup则重复此过程,直到叶子View(如TextView)。叶子View的dispatchTouchEvent会调用onTouchEvent,若返回true则消费事件,事件不再向上传递;若返回false,事件回溯到父View的onTouchEvent处理。若所有View都不消费,最终由Activity的onTouchEvent处理。需注意,ACTION_DOWN事件决定事件传递链,后续ACTION_MOVE/ACTION_UP会沿相同路径传递,若中途父View拦截后续事件,子View会收到ACTION_CANCEL。Handler的消息机制中,Looper、MessageQueue、Handler的协作流程是怎样的?如何处理主线程Looper的阻塞问题?Looper通过prepare()初始化并创建MessageQueue,prepareMainLooper()为ActivityThread创建主线程Looper。Handler构造时绑定Looper,通过sendMessage()将Message插入MessageQueue(enqueueMessage)。Looper.loop()循环调用MessageQueue.next()取出消息,通过msg.target(即Handler)的dispatchMessage()处理。主线程Looper阻塞发生在MessageQueue.next()的nativePollOnce(),此时线程挂起等待新消息,不会消耗CPU。当有新消息(如postDelayed或sendMessageDelayed)时,通过nativeWake()唤醒线程。主线程阻塞是合理设计,避免空转消耗资源,而ANR的本质是主线程在处理消息时被耗时操作阻塞,导致无法及时响应输入或生命周期事件。如何定位和解决Android应用的内存泄漏?常见泄漏场景有哪些?定位工具:LeakCanary(自动检测)、AndroidStudio的Profiler(内存快照分析)、MAT(手动分析hprof文件)。解决思路:检查对象生命周期,确保长生命周期对象不持有短生命周期对象(如Activity)的强引用。常见场景:1.静态变量持有Activity:如单例模式中直接持有Activity,应改用WeakReference或ApplicationContext;2.未取消的回调:如注册了BroadcastReceiver、EventBus但未反注册,需在onDestroy中取消;3.Handler匿名内部类:持有外部Activity,应改为静态内部类+WeakReference,并在onDestroy中移除未处理消息;4.资源未释放:如Cursor、Bitmap未close/recycle,需在finally块中释放;5.动画未停止:属性动画未调用cancel(),导致View被持有,需在onDestroy中停止。ANR的常见原因及排查方法是什么?ANR(ApplicationNotResponding)发生在主线程超过5秒无响应(输入事件)或BroadcastReceiver超过10秒未处理完成。常见原因:主线程执行耗时操作(如数据库查询、文件IO、网络请求);锁竞争导致主线程阻塞(如主线程等待子线程持有的锁);系统服务响应慢(如Binder调用超时)。排查方法:1.查看/data/anr/traces.txt文件,分析主线程堆栈,定位阻塞位置;2.使用StrictMode检测主线程违规操作(setThreadPolicy);3.AndroidStudio的Profiler监控主线程CPU使用率和方法耗时;4.自定义ANR监控:通过Handler发送延迟消息,若超时未收到回调则dump堆栈(需注意误报)。MVVM架构中,LiveData与ViewModel的作用分别是什么?如何避免内存泄漏?ViewModel用于管理与界面相关的数据,生命周期与Activity/Fragment绑定(通过ViewModelProvider),配置变更(如旋转)时不会被销毁。LiveData是可观察的数据持有者,具备生命周期感知能力(仅在Activity/Fragment处于活跃状态时通知观察者),避免因界面销毁后回调导致的崩溃。避免泄漏的关键:ViewModel不持有Activity/Fragment的强引用(可用ApplicationContext代替);LiveData的观察者需使用observe()方法(绑定LifecycleOwner),自动在onDestroy时移除;若需在ViewModel中执行耗时操作(如网络请求),应使用协程或RxJava,并在ViewModel的onCleared()中取消未完成的任务。Retrofit的核心原理是什么?如何实现接口方法到HTTP请求的转换?Retrofit通过动态代理(Proxy.newProxyInstance)将定义的接口方法转换为HTTP请求。关键步骤:1.注解解析:通过@GET、@POST等方法注解和@Path、@Query等参数注解,解析请求方式、URL、参数;2.适配器(CallAdapter):将OkHttp的Call转换为其他类型(如RxJava的Observable、协程的Deferred);3.转换器(Converter):处理请求体(RequestBody)和响应体(ResponseBody)的序列化/反序列化(如GsonConverterFactory)。具体实现:调用接口方法时,动态代理提供的代理对象会收集方法上的注解和参数,构建Request对象,通过OkHttpClient发送请求,最终将响应转换为定义的返回类型。Glide的缓存策略是怎样的?如何优化大图加载?Glide的缓存分为内存缓存和磁盘缓存。内存缓存使用LruCache(最近最少使用)和弱引用缓存(ActiveResources),ActiveResources缓存当前正在显示的图片,避免重复加载;LruCache缓存最近使用过的图片,大小可通过MemorySizeCalculator计算。磁盘缓存默认使用DiskLruCache(基于文件),分为全尺寸缓存(原始图片)和降采样缓存(根据ImageView尺寸调整后的图片),策略可通过DiskCacheStrategy配置(如ALL、NONE、DATA等)。优化大图加载的方法:指定ImageView的宽高(android:layout_width/android:layout_height),Glide会根据尺寸自动降采样(decodeSampledBitmapFromResource);使用override()方法显式指定加载尺寸;禁用内存缓存(skipMemoryCache(true))或磁盘缓存(diskCacheStrategy(DiskCacheStrategy.NONE)),但需谨慎;对于长图,使用Glide的DownsampleStrategy(如AT_MOST)或自定义Target处理;结合Activity/Fragment生命周期,使用into()时绑定生命周期,避免不必要的加载。Kotlin协程相比RxJava有哪些优势?如何处理协程的异常?协程优势:语法更简洁,通过suspend关键字和结构化并发(CoroutineScope)避免回调嵌套;与Android生命周期深度集成(如LifecycleScope),自动取消协程防止泄漏;轻量级,协程切换成本远低于线程切换。异常处理:全局异常处理:通过CoroutineExceptionHandler捕获未处理的异常;局部处理:使用try-catch包裹suspend函数调用;Job的异常传播:父协程异常会取消所有子协程,子协程异常默认不会影响父协程(可通过SupervisorJob改变);确保在finally块中释放资源(如关闭网络连接),使用runCatching包装可能抛异常的操作。JetpackCompose相比传统XML布局有哪些改进?如何管理状态?Compose是声明式UI框架,与XML的区别:声明式编程:通过@Composable函数描述UI状态,状态变化时自动重组(Recompose),无需手动调用findViewById或setXXX;生命周期集成:Composable函数自动感知组件生命周期(如进入/离开屏幕时执行副作用);性能优化:重组时仅更新变化的组件(通过Skippable组和Key机制),减少不必要的绘制。状态管理:可观察状态:使用remember{mutableStateOf()}创建,状态变化时触发重组;状态提升(StateHoisting):将状态提升到父组件,子组件通过参数接收状态和修改状态的方法,实现单向数据流;生命周期感知:使用rememberCoroutineScope()在Composable中创建协程作用域,自动随组件销毁取消;持久化状态:通过ViewModel+SavedStateHandle保存配置变更时的状态,避免重组丢失。组件化开发中,如何解决组件间通信和路由跳转?通信方案:接口下沉:在公共模块定义接口,各组件实现接口并注册到管理类(如ServiceLoader),调用方通过接口调用,解耦实现;事件总线:使用EventBus或LocalBroadcastManager发送事件,需注意事件类型管理和性能(避免高频事件);AAC的SharedViewModel:通过Activity作用域的ViewModel共享数据,适合同进程内组件通信。路由跳转:显式路由:通过Intent显式跳转,但需知道目标组件的类名,耦合高;隐式路由:定义统一的URL协议(如scheme://host/path),通过ARouter等框架注册路径与Activity的映射,调用方通过URL跳转,框架解析并启动目标组件;拦截器:在路由跳转过程中添加拦截器(如登录状态检查),处理跳转前的逻辑;跨进程通信:使用AIDL或Messenger,需定义Binder接口,处理序列化和进程安全。Android14的新特性对开发有哪些影响?隐私增强:敏感权限(如相机、麦克风)的访问需在前台服务中声明,后台访问受限;应用启动优化:支持预启动(AppPrelaunch),系统提前启动应用进程,需优化冷启动速度避免被终止;语言区域设置:用户可单独设置应用的语言,需通过LocaleManager获取应用特定的语言设置;大屏幕支持:强制要求多窗口模式下的布局适配(默认启用),需测试分屏、自由窗口模式;数据删除控制:用户可选择删除应用的特定类型数据(如缓存、文档),需实现onClearDataRequest()回调;图形渲染:支持WebP动画解码,新增ImageDecoder的动画解码API,优化动图加载。如何优化应用的启动速度?具体步骤有哪些?启动优化需区分冷启动(进程未创建)和热启动(进程已存在但Activity需重建),核心是减少主线程耗时。步骤:1.测量启动时间:使用adb命令(adbshellamstart-Wpackage/.MainActivity)获取TotalTime,或在Application的onCreate和MainActivity的onResume中打点计算;2.减少Application初始化耗时:将非必要初始化(如统计、推送)延迟到后台线程(使用IntentService或协程),或按需加载(如首次进入页面时初始化);3.优化MainActivity的onCreate:避免在onCreate中执行耗时操作(如数据库查询),延迟加载非首屏视图(使用ViewStub或懒加载);4.使用启动窗口主题(SplashScreenAPI):Android12+支持,通过windowSplashScreenDrawable设置启动图,避免白屏/黑屏,同时在后台完成初始化;5.内存优化:减少启动时的内存分配(如

温馨提示

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

最新文档

评论

0/150

提交评论