返回

ActivityResultContract:更简洁、类型安全的startActivityForResult

Android

前言

在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,您可以使代码更加简洁、类型安全。