Skip to content

在 Android 开发中,使用 Intent 在 Activity 之间跳转是最基础且核心的操作。以下是 Kotlin 的完整实现和关键细节:


1. 显式 Intent(明确指定目标 Activity)

基本跳转

kotlin
// 从当前 Activity 跳转到 TargetActivity
val intent = Intent(this, TargetActivity::class.java)
startActivity(intent)

传递数据

kotlin
// 发送数据
val intent = Intent(this, TargetActivity::class.java).apply {
    putExtra("key_string", "Hello from Activity A")
    putExtra("key_int", 100)
    putExtra("key_boolean", true)
}
startActivity(intent)

// 在 TargetActivity 中接收数据
class TargetActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val stringValue = intent.getStringExtra("key_string")
        val intValue = intent.getIntExtra("key_int", 0) // 默认值 0
        val booleanValue = intent.getBooleanExtra("key_boolean", false)
    }
}

2. 隐式 Intent(通过 Action 或 Category 匹配)

定义 Intent 过滤器

AndroidManifest.xml 中为目标 Activity 添加过滤器:

xml
<activity android:name=".TargetActivity">
    <intent-filter>
        <action android:name="com.example.ACTION_SHOW_DETAIL" />
        <category android:name="android.intent.category.DEFAULT" />
        <!-- 指定数据类型(可选) -->
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

触发跳转

kotlin
val intent = Intent("com.example.ACTION_SHOW_DETAIL").apply {
    // 添加数据(可选)
    putExtra("message", "This is a text message")
    type = "text/plain" // 匹配 MIME 类型
}
startActivity(intent)

3. 返回数据到上一个 Activity

启动 Activity 并等待结果

kotlin
// 在 Activity A 中启动 Activity B,并设置请求码
val intent = Intent(this, ActivityB::class.java)
startActivityForResult(intent, REQUEST_CODE) // REQUEST_CODE 是自定义的整型常量(如 1001)

// 处理返回结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        val result = data?.getStringExtra("result_key")
        // 处理返回数据
    }
}

在 Activity B 中返回数据

kotlin
// 设置返回结果
val resultIntent = Intent().apply {
    putExtra("result_key", "Data from Activity B")
}
setResult(RESULT_OK, resultIntent)
finish() // 关闭当前 Activity

4. 高级用法

传递复杂对象(需实现 Parcelable 或 Serializable)

kotlin
// 定义数据类(实现 Parcelable)
@Parcelize
data class User(val name: String, val age: Int) : Parcelable

// 发送对象
val user = User("Alice", 30)
val intent = Intent(this, TargetActivity::class.java).apply {
    putExtra("user", user)
}
startActivity(intent)

// 接收对象
val receivedUser = intent.getParcelableExtra<User>("user")

清空任务栈跳转

kotlin
val intent = Intent(this, LoginActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
startActivity(intent)

5. 注意事项

  1. 显式 Intent 更安全:优先使用显式 Intent,避免隐式 Intent 被其他应用拦截。
  2. Bundle 大小限制:传递的数据不宜过大(建议不超过 1MB),否则可能触发 TransactionTooLargeException
  3. 生命周期管理
    • onPause()onStop() 中处理跳转逻辑,而非 onDestroy()
    • 使用 startActivityForResult 时,确保 Activity 未被销毁(可用 ViewModel 保存临时数据)。
  4. 隐式 Intent 的风险:需验证目标 Activity 是否存在,避免崩溃:
    kotlin
    val intent = Intent("com.example.ACTION_SHOW_DETAIL")
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    } else {
        Toast.makeText(this, "未找到目标应用", Toast.LENGTH_SHORT).show()
    }

总结

  • 显式 Intent:明确指定目标类名,适合应用内部跳转。
  • 隐式 Intent:通过 Action/Category 匹配,适合跨应用交互。
  • 数据传递:简单数据用 putExtra,复杂对象需实现 Parcelable
  • 返回结果:使用 startActivityForResultonActivityResult 协作。