Android Results API协定类

161 阅读1分钟

参考博文:
基本使用:
郭霖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之前,进行预先处理,例如进行权限申请的时候,先进行权限判断,若权限已经获取,则不会进行后续操作