2021年Android开发面试题解析
Activity生命周期
一个Activity从创建到销毁会经历一系列状态变化,这些状态构成了Activity的生命周期。了解生命周期可以帮助我们更好地管理应用程序的资源和行为。
生命周期回调方法
- onCreate(): Activity首次创建时调用。用于完成初始化操作,例如加载布局、绑定数据等。
- onStart(): Activity可见但不可交互时调用。
- onResume(): Activity可见且可交互时调用。
- onPause(): Activity失去焦点但仍部分可见时调用。
- onStop(): Activity不可见时调用。
- onDestroy(): Activity销毁前调用。用于释放资源。
生命周期场景示例
场景一: 启动一个新的Activity
ActivityA --(startActivity)--> ActivityB
- ActivityA: onPause() -> onStop()
- ActivityB: onCreate() -> onStart() -> onResume()
场景二: 从Activity返回
ActivityB --(finish)--> ActivityA
- ActivityB: onPause() -> onStop() -> onDestroy()
- ActivityA: onRestart() -> onStart() -> onResume()
Android四大组件
Android应用程序的核心构建块,每个组件都有其独特的生命周期和用途。
Activity
- 作用: 负责与用户进行交互,提供可视化的用户界面。
- 特点: 一个应用程序可以有多个Activity,它们之间可以相互跳转。
Service
- 作用: 在后台执行长时间运行的操作,不提供用户界面。
- 特点: 即使应用程序切换到后台,服务仍然可以继续运行。
Broadcast Receiver
- 作用: 接收来自系统或其他应用程序的广播消息。
- 特点: 可以用于响应系统事件,例如电量变化、网络连接等。
Content Provider
- 作用: 提供了一种机制,允许应用程序之间共享数据。
- 特点: 可以对数据访问进行权限控制。
Android多线程
Android应用程序默认运行在主线程上,为了避免阻塞主线程导致ANR(应用程序无响应),需要使用多线程来处理耗时操作。
线程创建方式
- 继承Thread类: 重写run()方法。
- 实现Runnable接口: 实现run()方法,并将其传递给Thread类的构造函数。
线程间通信
- Handler: 用于将消息发送到主线程或其他线程的消息队列。
- AsyncTask: 简化了后台线程与主线程的交互。
- Looper: 每个线程都有一个Looper,用于循环处理消息队列。
内存泄漏
内存泄漏是指应用程序不再使用的对象仍然被引用,导致内存无法被垃圾回收机制回收,最终可能导致应用程序崩溃。
常见内存泄漏场景
- 静态变量持有Activity实例: 静态变量的生命周期与应用程序一致,如果持有Activity实例,会导致Activity无法被回收。
- 内部类持有外部类引用: 非静态内部类会持有外部类引用,如果内部类实例的生命周期超过外部类实例,会导致外部类实例无法被回收。
- 资源未关闭: 例如文件、数据库连接等,使用完毕后应及时关闭,否则会造成内存泄漏。
内存泄漏检测工具
- LeakCanary: 一个开源的内存泄漏检测库,可以自动检测并报告内存泄漏问题。
- Android Studio Profiler: Android Studio自带的性能分析工具,可以用于监测内存使用情况和检测内存泄漏。
其他常见面试题
Android系统架构
Android系统架构采用分层架构,从上到下依次为:
- 应用层: 包含各种应用程序。
- 应用框架层: 提供应用程序开发所需的各种API。
- 系统运行库层: 提供核心库和虚拟机。
- Linux内核层: 提供底层操作系统功能。
ANR异常
ANR(应用程序无响应)是指应用程序在主线程上执行了耗时操作,导致用户界面无法响应用户输入。
MVC、MVP、MVVM架构模式
- MVC: 将应用程序分为模型、视图和控制器三部分。
- MVP: 将视图和模型完全解耦,通过Presenter进行交互。
- MVVM: 使用数据绑定机制将视图和模型绑定在一起。