Android Activity核心机制与最佳实践详解
1. Activity基础概念解析Activity作为Android四大组件之一是应用与用户交互的核心界面单元。每个Activity都代表一个独立的用户界面开发者通过组合多个Activity构建完整的应用体验。在Android Studio中创建新项目时系统会自动生成MainActivity作为应用的入口点。1.1 Activity的核心特性界面容器承载View视图层级或Compose组件树生命周期感知系统通过回调方法管理状态转换任务栈管理通过Back Stack维护导航历史Intent通信支持显式/隐式启动方式// 基础Activity类继承 class MainActivity : AppCompatActivity() { // 必须实现的回调方法 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 传统View体系 // 或使用Compose // setContent { MyAppTheme { MainScreen() } } } }1.2 Context上下文关系Activity继承自ContextThemeWrapper具有完整的上下文能力资源访问getResources系统服务获取getSystemService启动其他组件startActivity权限校验checkSelfPermission注意避免长期持有Activity Context引用可能引发内存泄漏。对于需要Context的场景优先使用Application Context。2. 生命周期深度剖析2.1 标准生命周期状态状态转换包含三个核心生命周期循环完整生命周期onCreate() → onDestroy()可见生命周期onStart() → onStop()前台生命周期onResume() → onPause()2.2 关键回调方法实践onCreate()执行一次性初始化必须调用super.onCreate()恢复保存状态实例override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 检查是否为配置变更重建 if (savedInstanceState ! null) { val value savedInstanceState.getString(key) } // ViewModel初始化 viewModel ViewModelProvider(this)[MyViewModel::class.java] }onResume()恢复暂停的资源注册动态广播接收器启动动画/传感器override fun onResume() { super.onResume() sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL) }onPause()释放独占资源提交未保存数据注销监听器override fun onPause() { super.onPause() sensorManager.unregisterListener(this) // 快速保存轻量数据 preferences.edit().putInt(scrollPos, recyclerView.scrollY).apply() }2.3 配置变更处理设备旋转等配置变化会导致Activity重建正确处理方式方案1自动保存状态// 使用ViewModel保存数据 class MyViewModel : ViewModel() { val liveData MutableLiveDataString() } // UI状态使用rememberSaveable var text by rememberSaveable { mutableStateOf() }方案2手动配置处理activity android:name.MyActivity android:configChangesorientation|screenSize/警示配置变更处理不当会导致数据丢失或UI异常建议优先采用ViewModel保存状态机制。3. 高级应用技巧3.1 多窗口模式适配从Android 7.0开始支持分屏模式需要特殊处理override fun onMultiWindowModeChanged(isInMultiWindow: Boolean) { super.onMultiWindowModeChanged(isInMultiWindow) if (isInMultiWindow) { // 调整UI布局 toolbar.visibility View.GONE } }3.2 透明Activity实现创建半透明效果style nameTranslucentTheme parentTheme.AppCompat item nameandroid:windowIsTranslucenttrue/item item nameandroid:windowBackgroundandroid:color/transparent/item /style3.3 动态主题切换运行时更换主题// 在ViewModel中保存主题选择 viewModel.selectedTheme.observe(this) { theme - setTheme(theme.resId) recreate() // 重建Activity应用新主题 }4. 常见问题解决方案4.1 生命周期相关异常问题1onResume中获取View尺寸为0// 正确做法使用ViewTreeObserver view.viewTreeObserver.addOnGlobalLayoutListener { if (view.width 0) { // 安全获取尺寸 view.viewTreeObserver.removeOnGlobalLayoutListener(this) } }问题2异步任务导致内存泄漏// 使用LifecycleScope管理协程 lifecycleScope.launchWhenResumed { val data withContext(Dispatchers.IO) { repository.fetchData() } updateUI(data) }4.2 导航与返回栈处理深层链接跳转处理intent-filter action android:nameandroid.intent.action.VIEW/ category android:nameandroid.intent.category.DEFAULT/ category android:nameandroid.intent.category.BROWSABLE/ data android:schemeapp android:hostdetail/ /intent-filteroverride fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) handleDeepLink(intent) } private fun handleDeepLink(intent: Intent) { if (intent.action Intent.ACTION_VIEW) { val id intent.data?.getQueryParameter(id) id?.let { navigateToDetail(it) } } }5. 性能优化实践5.1 启动时间优化冷启动优化方案减少onCreate工作量延迟初始化非关键组件// 使用延迟加载 private val heavyObject by lazy { HeavyInitializer() } // 后台初始化 lifecycleScope.launch(Dispatchers.Default) { HeavyInitializer.preload() }5.2 内存管理技巧使用WeakReference处理Handler及时注销广播接收器监控Activity泄漏// build.gradle debugImplementation com.squareup.leakcanary:leakcanary-android:2.9.15.3 最佳实践总结遵循单一职责原则避免臃肿Activity业务逻辑委托给ViewModelUI更新使用LiveData/StateFlow资源释放匹配生命周期阶段使用DI框架管理依赖// 现代Activity典型结构 class ModernActivity : AppCompatActivity() { private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AppTheme { val uiState by viewModel.uiState.collectAsState() MainScreen(uiState, viewModel::onUserAction) } } } }对于需要兼容旧版代码的情况建议采用渐进式重构策略逐步将逻辑迁移到ViewModel和Compose组件中。