Activity中startActivityForResult和onActivityResult过时问题

使用registerForActivityResult

class LaunchActivity : AppCompatActivity() {
    private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        if (it.resultCode != Activity.RESULT_OK) finish()
        else findViewById(R.id.toWx).visibility = View.VISIBLE
    }

  ......

  // launcher 使用方法
  launcher.launch(Intent(this, LoginActivity::class.java))
}
  • registerForActivityResult第一个参数有两个值:ActivityResultContracts.StartActivityForResult()ActivityResultContracts.StartIntentSenderForResult()。使用第二个值时launcher的使用方法,如下:
class LaunchActivity : AppCompatActivity() {
    private val launcher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) {
        if (it.resultCode != Activity.RESULT_OK) finish()
        else findViewById(R.id.toWx).visibility = View.VISIBLE
    }

  ......

  // launcher 使用方法。这个就有点麻烦了
  launcher.launch(IntentSenderRequest.Builder(PendingIntent.getActivity(this, 345, Intent(this, LoginActivity::class.java), 0)).build())
  // launcher 删除图片。这个应该才是正常操作吧
  val pi = MediaStore.createTrashRequest(
        contentResolver,
        uris,
        true
   )
   launcher.launch(IntentSenderRequest.Builder(pi.intentSender).build())
}
  • registerForActivityResult必须在 Activity started 之前使用,否则报错。这种使用方式反而比较麻烦,不知道为啥换成这种使用方式。
  • ActivityCompat.startActivityForResult(this, Intent(this, LoginActivity::class.java), 7788, null)这个方法没有被标记过时,但是处理返回值还是在过时方法onActivityResult里面处理。所以这个方法好像也没用。

总结

  • startActivityForResult 和 onActivityResult 虽然过时还是可以继续使用的,对于老项目,也不急着修改,万一以后有新的好用点的api可以使用呢!
  • 对于新项目,还是使用 registerForActivityResult 吧!目前感觉 registerForActivityResult 并不好封装,因为没有requestCode来标记请求的哪个 Activity 。如果 resultCode能区分请求的哪个 Activity 的话,到是可以封装一下。
  • 也许是不推荐用 Activity,多用fragment吧!fragment 中 startActivityForResult 和onActivityResult 没有过时,navigation-fragment用起来。

你可能感兴趣的:(Activity中startActivityForResult和onActivityResult过时问题)