xDocxDoc
AI
前端
后端
iOS
Android
Flutter
AI
前端
后端
iOS
Android
Flutter
  • Android 面试合集

    • Android面试基础篇(一):基础架构与核心组件深度剖析
    • Android中高级面试(二):架构组件与协程实战精要
    • Android中高级面试(三):架构组件与性能优化实战
    • Android 面试(四): Kotlin 基础
    • Android面试(五):深入Kotlin协程
    • Android面试(六):深入Kotlin Flow
    • Android面试(七):Jetpack Compose 深度解析与高频考点
    • Android架构面试(八):从Jetpack到模块化设计
    • Android架构面试(九):Clean Architecture 终极指南
    • Android面试全栈指南:从Kotlin到Jetpack Compose

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

1.1 生命周期回调的实战意义

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()保存数据
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("editTextValue", mEditText.getText().toString());
}
  • 后台回收机制:当系统内存不足时,后台Activity可能被销毁,需通过ViewModel持久化数据

🧩 二、Jetpack架构组件:现代化开发的基石

2.1 ViewModel的生命周期感知

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数据库的实战优化

@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 消息循环核心原理

3.2 避免内存泄漏的实践

// 静态内部类+弱引用解决方案
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接口定义示例

// 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传输机制

📊 五、内存管理:性能优化的核心战场

5.1 内存泄漏检测工具链

# 生成堆转储文件
adb shell am dumpheap <进程名> /data/local/tmp/heapdump.hprof

# 使用MAT分析
mat/ParseHeapDump.sh heapdump.hprof

5.2 高效内存使用策略

// 使用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

// 生物认证集成示例
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
            }
        }
    }

总结

💡 核心要点

  1. 组件生命周期管理:掌握onSaveInstanceState()与ViewModel的数据持久化差异
  2. Jetpack架构实践:LiveData+ViewModel+Repository的响应式编程模型
  3. 线程通信机制:理解Handler/Looper的消息队列模型与内存泄漏解决方案
  4. 跨进程通信原理:Binder驱动层的拷贝次数优化(一次拷贝机制)
  5. 内存优化新趋势:结合Android Profiler识别内存抖动问题
最后更新: 2025/9/29 08:41
Next
Android中高级面试(二):架构组件与协程实战精要