Skip to content

在 Android 开发中,销毁 Activity 是管理应用生命周期的重要部分。以下是销毁 Activity 的常见方法和注意事项:


1. 手动销毁 Activity

方法 1:调用 finish()

kotlin
// 在 Activity 中直接调用
finish()
  • 作用:结束当前 Activity,触发 onDestroy() 生命周期方法。

方法 2:通过 Intent 标志销毁

kotlin
// 启动新 Activity 并销毁当前 Activity
val intent = Intent(this@CurrentActivity, NextActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
}
startActivity(intent)
finish()
  • FLAG_ACTIVITY_CLEAR_TOP:若目标 Activity 已在栈中,清除其上的所有 Activity。
  • FLAG_ACTIVITY_SINGLE_TOP:避免重复创建目标 Activity。

2. 生命周期与自动销毁

关键生命周期方法:

kotlin
override fun onPause() {
    super.onPause()
    // 保存临时数据
}

override fun onStop() {
    super.onStop()
    // 释放资源(如摄像头)
}

override fun onDestroy() {
    super.onDestroy()
    // 清理内存、注销监听器
}

3. 处理配置变更(避免销毁重建)

AndroidManifest.xml 中配置:

xml
<activity
    android:name=".YourActivity"
    android:configChanges="orientation|screenSize|keyboardHidden" />

手动处理配置变更:

kotlin
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // 处理屏幕旋转等配置变更
}

4. 保存和恢复状态

临时数据保存

kotlin
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("key", "value") // 保存数据
}

恢复数据

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val value = savedInstanceState?.getString("key") // 安全恢复数据
}

5. 注意事项(Kotlin 特有)

  1. 避免内存泄漏

    • 使用 lifecycleScope 替代全局协程。
    • onDestroy() 中取消协程或监听器:
      kotlin
      private var job: Job? = null
      
      override fun onDestroy() {
          job?.cancel() // 取消协程
          super.onDestroy()
      }
  2. 使用 by lazyviewBinding

    kotlin
    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
    }

示例:销毁前一个 Activity

kotlin
// 启动新 Activity 并销毁当前 Activity
val intent = Intent(this, NextActivity::class.java)
startActivity(intent)
finish() // 销毁当前 Activity