在 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. 注意事项
- 显式 Intent 更安全:优先使用显式 Intent,避免隐式 Intent 被其他应用拦截。
- Bundle 大小限制:传递的数据不宜过大(建议不超过 1MB),否则可能触发
TransactionTooLargeException
。 - 生命周期管理:
- 在
onPause()
或onStop()
中处理跳转逻辑,而非onDestroy()
。 - 使用
startActivityForResult
时,确保 Activity 未被销毁(可用ViewModel
保存临时数据)。
- 在
- 隐式 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
。 - 返回结果:使用
startActivityForResult
和onActivityResult
协作。