Activity Result Api 的使用



前言

       Activity Results API 是 Google官方推荐的Activity、Fragment获取返回结果的方式。之前startActivityForResult的方法获取结果的方法谷歌已经不在推荐使用。


一、使用步骤


1.引入库

代码如下(示例):

    implementation 'androidx.appcompat:appcompat:1.3.1'


2. 以启动activity为例

代码如下(示例):

class MainActivity : AppCompatActivity() {

    private val myActivityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ activityResult ->
        if(activityResult.resultCode == Activity.RESULT_OK){
            val result = activityResult.data?.getStringExtra("result")
            Toast.makeText(applicationContext,result,Toast.LENGTH_SHORT).show()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding=ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.text.setOnClickListener {
            myActivityLauncher.launch(Intent(this,MainActivity2::class.java))
        }
    }
}

第二个活动正常返回

class MainActivity2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMain2Binding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.back.setOnClickListener {
            val intent = Intent().apply {
                putExtra("result", "Hello")
            }
            setResult(Activity.RESULT_OK, intent)
            finish()
        }

    }
}


3.其他功能

除了StartActivityForResult 官方还提供了很多其他Contract 如下:

  • StartActivityForResult: 通用的Contract,不做任何转换,Intent作为输入,ActivityResult作为输出,这也是最常用的一个协定。

  • RequestMultiplePermissions:用于请求一组权限

  • RequestPermission: 用于请求单个权限

  • TakePicturePreview: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值为Bitmap图片

  • TakePicture: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,并将图片保存到给定的Uri地址,返回true表示保存成功。

  • TakeVideo: 调用MediaStore.ACTION_VIDEO_CAPTURE 拍摄视频,保存到给定的Uri地址,返回一张缩略图。

  • PickContact: 从通讯录APP获取联系人

  • GetContent: 提示用选择一条内容,返回一个通过ContentResolver#openInputStream(Uri)访问原生数据的Uri地址(content://形式) 。默认情况下,它增加了 Intent#CATEGORY_OPENABLE, 返回可以表示流的内容。

  • CreateDocument: 提示用户选择一个文档,返回一个(file:/http:/content:)开头的Uri。

  • OpenMultipleDocuments: 提示用户选择文档(可以选择多个),分别返回它们的Uri,以List的形式。

  • OpenDocumentTree: 提示用户选择一个目录,并返回用户选择的作为一个Uri返回,应用程序可以完全管理返回目录中的文档。

4 请求权限

//单个权限
private val permissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
                if (isGranted) {
                    Toast.makeText(applicationContext, "同意", Toast.LENGTH_SHORT).show()
                } else {
                    Toast.makeText(applicationContext, "失败", Toast.LENGTH_SHORT).show()
                }
            
        }

permissionLauncher.launch(android.Manifest.permission.READ_CONTACTS)
        
       

//多个权限
private val permissionsLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { isGrantedMap ->
            
            isGrantedMap.entries.forEach {
                if (it.value) {
                    grantedList.add(it.key)
                } else {
                    deniedList.add(it.key)
                }
            }
            
        }

permissionsLauncher.launch(arrayOf(android.Manifest.permission.READ_CONTACTS,android.Manifest.permission.CALL_PHONE))

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值