Android大厂面试题
什么是Android四大组件?请简述各自的作用并举例说明应用场景。
Android四大组件包括:
Activity:代表一个具有用户界面的可交互应用程序组件,负责展示视图和处理用户操作。例如,主界面、设置页面等都是由Activity实现。
Service:一种在后台运行且无用户界面的服务组件,可以执行长时间运行的操作或为其他组件提供后台功能支持。例如,音乐播放服务、数据同步服务等。
BroadcastReceiver:用于接收来自系统或其他应用发出的全局广播事件,并作出响应。例如,当设备网络状态改变时,应用通过注册BroadcastReceiver监听相关Intent,从而做出相应调整。
ContentProvider:提供统一的数据访问接口,使得不同应用间能共享数据。例如,联系人应用通过ContentProvider对外提供联系人数据,其他应用通过URI即可查询或修改这些数据。
请解释一下AndroidManifest.xml文件的作用,并列举几个重要的属性。
AndroidManifest.xml是每个Android应用的配置文件,主要作用包括:
声明应用的基本信息:如包名、版本号、应用名称等。
定义四大组件:声明组件类名、生命周期、对外权限等。 - 声明所需权限:如网络访问、读写存储、获取位置信息等权限。
定义应用的硬件和软件需求:如最低支持的Android版本、支持的屏幕尺寸和方向、使用的硬件特性等。
解释一下Android中的主线程(UI线程)与子线程,并举例说明如何安全地在子线程更新UI。
主线程(UI线程):负责处理与用户交互、绘制UI界面等操作。Android系统规定所有与UI相关的操作必须在主线程中完成。
子线程:除主线程外,用于执行耗时操作(如网络请求、大量计算等)的线程,避免阻塞UI线程,保证应用流畅性。
安全更新UI的方式: 使用Handler 、Looper 机制,或者AsyncTask 、LiveData 、ViewModel 结合post() 、postDelayed() 、setValue() 等方法,将UI更新逻辑切换回主线程执行。 例如:
new
Handler
(
Looper
.
getMainLooper
()).
post
(
new
Runnable
()
{
@Override
public
void
run
()
{
// 更新UI代码
}
});
请解释什么是ANR(Application Not Responding),并列举几种可能导致ANR的原因及预防措施。
ANR是指应用程序无响应,即在特定时间内未能处理用户的输入事件或未完成系统要求的定时任务,导致用户体验下降。常见原因及预防措施包括:
主线程阻塞:长时间运行的计算、数据库操作、网络请求等。预防措施是将耗时操作放入子线程,使用异步处理。
BroadcastReceiver超时:在onReceive()方法中执行耗时任务。应在BroadcastReceiver中快速处理逻辑,复杂操作移至服务或异步任务。
InputEvent超时:未及时处理用户输入事件。确保主线程响应迅速,避免阻塞。
请简述Android中的内存泄漏及其检测与解决方法。
内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间,造成系统资源浪费,严重时可能导致应用卡顿甚至崩溃。
检测与解决方法:
使用Android Studio Profiler、LeakCanary等工具动态监测内存泄漏。
检查是否存在长期持有Context引用的对象,如非静态内部类、单例模式中的Context引用等,应使用弱引用或适当生命周期的Context。
确保及时解除监听器、回调等对象的注册,防止匿名内部类持有Activity/Fragment引用。
注意Cursor、FileInputStream等资源的关闭,以及Bitmap、Drawable等大对象的正确回收。
Android中的进程和线程的区别,以及它们在Android系统中的角色。
进程:操作系统分配资源和调度的基本单位,每个进程有独立的内存空间。Android中,每个应用通常对应一个主进程,还可以根据需要创建多个进程。系统根据进程的重要性和资源状况进行调度和管理,如低内存时可能杀死后台进程。
线程:CPU调度和执行的最小单元,同一进程内的线程共享内存空间。在Android应用中,主线程负责UI交互,子线程处理耗时任务。
角色: 进程主要用于隔离不同应用和应用内不同模块,保证安全性、资源分配和故障隔离。线程则负责具体的任务执行和并发处理,提高应用的响应速度和执行效率。
简述Android中Activity的生命周期,并说明在哪些生命周期方法中适合进行哪些操作。
Activity的生命周期包括以下几个关键方法:
onCreate():初始化组件、设置布局、绑定数据等。
onStart():Activity变为可见状态,但未与用户交互。 - onResume():Activity处于前台,可与用户交互。
onPause():新Activity启动或部分覆盖当前Activity时调用,保存关键状态信息,暂停动画或耗时操作。
onStop():Activity完全不可见,释放不影响UI状态的资源。
onDestroy():Activity即将被销毁,释放所有资源。
操作:
onCreate():初始化工作,加载布局,设置监听器等。
onStart()、onResume():启动或恢复网络请求、传感器监听等。
onPause():停止动画、网络请求、保存临时数据、注销监听器等。
onStop():释放不再使用的资源,如大对象、数据库连接等。
onDestroy():清理所有资源,如取消异步任务、关闭数据库等。
请解释一下Android中View的工作原理,包括MeasureSpec、Layout、Draw流程。
MeasureSpec: MeasureSpec是父容器传递给子View的一个32位int值,包含测量模式(MeasureSpec.MODE)和尺寸大小(MeasureSpec.SIZE)。在onMeasure() 方法中,View根据MeasureSpec确定自身的尺寸。
Layout: 父容器调用子View的layout() 方法,传入左、上、右、下四个坐标值,子View据此确定自己的布局位置。
Draw: View的绘制流程如下: - dispatchDraw():父容器遍历所有子View,调用draw() 方法。
onDraw():View绘制自身内容,如文字、图片等。
onDrawForeground():绘制前景元素(API 23及以上)。
onDrawScrollBars():绘制滚动条(如有)。
请简述Android中的MVVM架构模式,并阐述其相对于MVC、MVP的优势。
MVVM: Model-View-ViewModel架构中,Model负责数据和业务逻辑,View负责显示UI,ViewModel作为桥梁,持有Model数据并对数据进行加工,同时暴露可观察的数据对象供View订阅,实现数据绑定和自动更新。
优势:
相比于MVC、MVP:
解耦更彻底:ViewModel与View之间通过数据绑定通信,无需直接相互引用。
易于测试:ViewModel不含UI相关逻辑,便于进行单元测试。
开发效率高:利用数据绑定库(如Data Binding、Jetpack Compose),减少手动编写findViewById和数据同步代码。
请简述Kotlin协程在Android开发中的作用,并给出一个使用场景。
Kotlin协程: 协程是一种轻量级的异步编程方式,通过挂起函数实现非阻塞的并发处理,简化异步代码,提升程序的可读性和可维护性。
作用:
简化异步编程:避免回调地狱,代码逻辑更清晰。
更高效的资源利用:相比线程,协程切换开销小,更适合I/O密集型任务。
更好的控制流:提供挂起、取消、异常处理等机制。使用场景: 在网络请求中,使用协程替代传统异步回调:lifecycleScope.launch