参考博文:
基本使用:
郭霖Result讲解
Result各个协议类使用
原理解析:
依旧范特西Result讲解带部分流程分析
代码版本:34
依赖版本:activity_version="1.8.2",fragment_version = "1.6.2"(往期版本,需添加result依赖包)
基础知识:
在Activity 、Fragment中 使用
启动Activity
private val activityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult(),
object : ActivityResultCallback<ActivityResult> {
override fun onActivityResult(result: ActivityResult) {
if (result.resultCode == RESULT_OK) {
result.data?.also { intent ->
//TODO 业务逻辑
}
}
}
})
//启动Activity
activityLauncher.launch(Intent(....))
本身写法看起来复杂,可以直接使用lambda表达式
private val activityLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
result.data?.also { intent ->
}
}
}
获取权限
pickContact获取联络人的协定
private val permissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) {
pickContact.launch(null)
}
}
获取联络人信息
如果只是单纯的获取联络人姓名无需申请权限,PickContact 使用的是Intent.ACTION_PICK 如果需要获取联络人的手机号,则需要进行权限获取,具体代码如下(不包含权限申请)
private val pickContact = registerForActivityResult(ActivityResultContracts.PickContact()) { uri ->
uri?.apply {
val queryFields = arrayOf(ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts._ID)
val cursor = contentResolver.query(uri, queryFields, null, null, null)
cursor?.apply {
moveToFirst()
val columnIndex = getColumnIndex(ContactsContract.Contacts._ID)
val contactId = getString(columnIndex)
val contactCursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId,
null,
null
)
contactCursor?.apply {
if (contactCursor.count > 0) {
contactCursor.moveToFirst()
val columnNumberIndex = contactCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
contactCursor.getString(columnNumberIndex).toast()
}
}
contactCursor?.close()
}
cursor?.close()
}
}
其他协议类类似,具体参考上面博文
类的讲解
ActivityResultContract<I, O> :
抽象类,指定可以使用类型的 I 输入调用活动并生成类型 O为 的输出。
两个抽象方法:
abstract fun createIntent(context: Context, input: I): Intent:对输入内容进行处理,最后返回一个Intent类型,而最后启动Intent,本质还是调用startActivityForResult
abstract fun parseResult(resultCode: Int, intent: Intent?): O : 对返回结果进行处理,本质是onActivityResult的转发
getSynchronousResult:可继承方法:进行createIntent之前,进行预先处理,例如进行权限申请的时候,先进行权限判断,若权限已经获取,则不会进行后续操作