使用registerForActivityResult
class LaunchActivity : AppCompatActivity() {
private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode != Activity.RESULT_OK) finish()
else findViewById<View>(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<View>(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
用起来。