🔍 一、Android面试基础(一):基础架构与核心组件深度剖析
1.1 生命周期回调的实战意义
java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化UI和数据绑定
Log.d("Lifecycle", "onCreate: 首次创建Activity");
}
@Override
protected void onStart() {
super.onStart();
// 恢复后台不可见时被释放的资源
Log.d("Lifecycle", "onStart: Activity可见但未获焦点");
}
@Override
protected void onResume() {
super.onResume();
// 启动相机/传感器等实时性操作
Log.d("Lifecycle", "onResume: Activity获得用户焦点");
}
@Override
protected void onPause() {
super.onPause();
// 保存临时数据,释放高耗电资源
Log.d("Lifecycle", "onPause: 失去焦点但部分可见");
}
@Override
protected void onStop() {
super.onStop();
// 释放UI相关资源
Log.d("Lifecycle", "onStop: 完全不可见");
}
@Override
protected void onDestroy() {
super.onDestroy();
// 解除绑定服务,清理线程
Log.d("Lifecycle", "onDestroy: 实例销毁");
}
}
关键场景解析:
- 配置变更重建 :屏幕旋转时系统自动调用
onSaveInstanceState()
保存数据
java
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("editTextValue", mEditText.getText().toString());
}
- 后台回收机制 :当系统内存不足时,后台Activity可能被销毁,需通过
ViewModel
持久化数据
🧩 二、Jetpack架构组件:现代化开发的基石
2.1 ViewModel的生命周期感知
kotlin
class UserViewModel : ViewModel() {
private val _userData = MutableLiveData<User>()
val userData: LiveData<User> get() = _userData
init {
viewModelScope.launch {
// 协程内获取网络数据
_userData.value = fetchUserFromServer()
}
}
}
// Activity中观察数据变化
userViewModel.userData.observe(this) { user ->
updateUI(user)
}
2.2 Room数据库的实战优化
kotlin
@Dao
interface UserDao {
@Query("SELECT * FROM users WHERE age > :minAge")
fun getAdultUsers(minAge: Int): Flow<List<User>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUser(user: User)
@Transaction
open suspend fun updateUserProfile(user: User, profile: Profile) {
insertUser(user)
insertProfile(profile)
}
}
性能优化技巧:
-
使用
@Transaction
保证多表操作的原子性 -
通过
Flow
实现数据库变更的实时监听 -
结合
Paging 3
实现分页加载
⚙️ 三、Handler/Looper机制:线程通信的引擎
3.1 消息循环核心原理
graph TD
A[Handler.sendMessage] --> B(MessageQueue.enqueueMessage)
B --> C{Looper.loop}
C --> D[MessageQueue.next]
D --> E[Handler.dispatchMessage]
E --> F[handleMessage处理]
3.2 避免内存泄漏的实践
java
// 静态内部类+弱引用解决方案
static class SafeHandler extends Handler {
private final WeakReference<Activity> mActivityRef;
SafeHandler(Activity activity) {
mActivityRef = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
Activity activity = mActivityRef.get();
if (activity != null && !activity.isFinishing()) {
// 安全更新UI
}
}
}
🔗 四、Binder跨进程通信:系统级交互的桥梁
4.1 AIDL接口定义示例
java
// IRemoteService.aidl
interface IRemoteService {
int calculate(in int param1, in int param2);
}
// 服务端实现
private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
@Override
public int calculate(int param1, int param2) {
return param1 + param2;
}
};
4.2 Binder传输机制
sequenceDiagram
Client->>+Binder Driver: 发送transact请求
Binder Driver->>+Server: 执行onTransact
Server-->>-Binder Driver: 返回结果
Binder Driver-->>-Client: 接收reply
📊 五、内存管理:性能优化的核心战场
5.1 内存泄漏检测工具链
bash
# 生成堆转储文件
adb shell am dumpheap <进程名> /data/local/tmp/heapdump.hprof
# 使用MAT分析
mat/ParseHeapDump.sh heapdump.hprof
5.2 高效内存使用策略
kotlin
// 使用SparseArray替代HashMap
val sparseArray = SparseArray<String>().apply {
put(1, "Android")
put(2, "Kotlin")
}
// 对象池技术实现
object BitmapPool {
private val pool = Stack<Bitmap>()
fun getBitmap(width: Int, height: Int): Bitmap {
return if (pool.isNotEmpty()) pool.pop()
else Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
}
fun recycle(bitmap: Bitmap) {
if (!bitmap.isRecycled) {
pool.push(bitmap)
}
}
}
六、Credential Manager API
kotlin
// 生物认证集成示例
val credentialManager = CredentialManager.create(this)
val request = GetCredentialRequest.Builder()
.addCredentialOption(PasswordCredentialOption())
.addCredentialOption(PublicKeyCredentialOption())
.build()
credentialManager.getCredential(request)
.addOnSuccessListener { result ->
val credential = result.credential
when (credential) {
is PasswordCredential -> {
val username = credential.id
val password = credential.password
}
is PublicKeyCredential -> {
val response = credential.authenticationResponse
}
}
}
总结
::: tip 💡 核心要点
-
组件生命周期管理 :掌握
onSaveInstanceState()
与ViewModel
的数据持久化差异 -
Jetpack架构实践:LiveData+ViewModel+Repository的响应式编程模型
-
线程通信机制:理解Handler/Looper的消息队列模型与内存泄漏解决方案
-
跨进程通信原理:Binder驱动层的拷贝次数优化(一次拷贝机制)
-
内存优化新趋势:结合Android Profiler识别内存抖动问题
:::