Android面试基础篇(一):基础架构与核心组件深度剖析

原文:xuanhu.info/projects/it...

🔍 一、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 💡 核心要点

  1. 组件生命周期管理 :掌握onSaveInstanceState()ViewModel的数据持久化差异

  2. Jetpack架构实践:LiveData+ViewModel+Repository的响应式编程模型

  3. 线程通信机制:理解Handler/Looper的消息队列模型与内存泄漏解决方案

  4. 跨进程通信原理:Binder驱动层的拷贝次数优化(一次拷贝机制)

  5. 内存优化新趋势:结合Android Profiler识别内存抖动问题

:::

原文:xuanhu.info/projects/it...

相关推荐
wow_DG4 小时前
【MySQL✨】MySQL 入门之旅 · 第十篇:数据库备份与恢复
android·数据库·mysql
00后程序员张5 小时前
iOS 26 系统流畅度深度剖析,Liquid Glass 视效与界面滑动的实际测评
android·macos·ios·小程序·uni-app·cocoa·iphone
草字5 小时前
Android studio 查看apk的包名,查看包名
android·ide·android studio
、BeYourself5 小时前
Android Studio 详细安装与配置指南
android
夜晚中的人海5 小时前
C++11(2)
android·数据库·c++
crystal_pin6 小时前
Canvas优化思路
面试
今禾6 小时前
深入理解CSS媒体查询
前端·css·面试
倔强青铜三6 小时前
苦练Python第56天:元类•描述符•异步•Pickle 的 28 个魔术方法——从入门到精通
人工智能·python·面试
倔强青铜三6 小时前
苦练Python第55天:容器协议的七个魔术方法从入门到精通
人工智能·python·面试