返回
ActivityResultContract:更简洁、类型安全的startActivityForResult
Android
2024-02-16 01:07:53
前言
在Android开发中,我们经常需要在两个Activity之间传递数据。传统的方法是使用startActivityForResult()方法,但是这种方法存在一些缺点,比如:
- 代码繁琐:需要手动编写onActivityResult()方法来处理结果。
- 类型不安全:无法保证传递的数据类型是正确的。
ActivityResultContract
为了解决这些问题,Android官方在AndroidX中引入了一个新的API——ActivityResultContract。ActivityResultContract是一个非常方便的API,它可以轻松地替换传统的startActivityForResult()方法。
优势
使用ActivityResultContract具有以下优势:
- 代码简洁: 使用ActivityResultContract,您无需再手动编写onActivityResult()方法来处理结果。
- 类型安全: ActivityResultContract可以保证传递的数据类型是正确的。
- 易于使用: ActivityResultContract非常易于使用,只需要几行代码即可完成数据的传递。
使用示例
下面是一个使用ActivityResultContract的示例:
class MyActivity : AppCompatActivity() {
private val contract = RegisterForActivityResult(MyContract()) { result ->
// Handle the result
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.button).setOnClickListener {
contract.launch(null)
}
}
class MyContract : ActivityResultContract<Void, String>() {
override fun createIntent(context: Context, input: Void?): Intent {
return Intent(context, ResultActivity::class.java)
}
override fun parseResult(resultCode: Int, intent: Intent?): String {
return intent?.getStringExtra("result") ?: ""
}
}
}
在上面的示例中,我们首先定义了一个ActivityResultContract的子类MyContract。然后,我们在MyActivity中使用RegisterForActivityResult()方法来注册一个ActivityResultContract。最后,我们在按钮的点击事件中调用contract.launch()方法来启动一个新的Activity。
结语
ActivityResultContract是一个非常方便的API,它可以轻松地替换传统的startActivityForResult()方法。使用ActivityResultContract,您可以使代码更加简洁、类型安全。