Android Activity Result API 使用

本文介绍了在Android应用中如何使用新的ActivityResult API进行页面跳转和权限申请。通过示例代码展示了如何实现普通的页面跳转,以及如何使用registerForActivityResult请求单个和多个权限。同时,详细列举了预定义的Contract,如StartActivityForResult、RequestMultiplePermissions等,这些Contract简化了与其他应用交互的过程,如拍照、选择联系人、打开文档等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在app下的build.gradle引入:

implementation 'androidx.activity:activity:1.2.0-beta01'
implementation 'androidx.fragment:fragment:1.3.0-beta01'

2.页面普通跳转(原startActivityForResult)

(1)第一个页面:

class MainActivity : AppCompatActivity() {

    private lateinit var textview: TextView

    private val myActivityLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult->
            if (activityResult.resultCode == RESULT_OK){
                val result = activityResult.data?.getStringExtra("result")
                textview.text = "回传数据:$result"
            }

        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textview = findViewById(R.id.textview)
        findViewById<Button>(R.id.button).setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java).apply {
                putExtra("name", "第一个页面传递的数据")
            }
            myActivityLauncher.launch(intent)

        }
    }
    
}

(2)第二个页面:

class SecondActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        val textView = findViewById<TextView>(R.id.textview)

        val name = intent.getStringExtra("name")
        textView.text = "接收数据:$name"
        textView.setOnClickListener {
            val intent = Intent().apply {
                putExtra("result", "第二个页面回传数据")
            }
            setResult(RESULT_OK, intent)
            finish()
        }
    }
}

(3)效果:

第二个页面:
第二个页面接收

第一个页面:
在这里插入图片描述

3.权限申请:

class MainActivity : AppCompatActivity() {

    private lateinit var textview: TextView

    private val myActivityLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult ->
            if (activityResult.resultCode == RESULT_OK) {
                val result = activityResult.data?.getStringExtra("result")
                textview.text = "回传数据:$result"
            }

        }

    //请求单个权限
    private val requestOnePermission =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
            if (isGranted) Toast.makeText(this, "权限已授予", Toast.LENGTH_SHORT).show()
            else Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show()

        }

    //请求一组权限
    private val requestMultiplePermissions =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions: Map<String, Boolean> ->
            if (permissions.entries.any { !it.value }){
                Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "权限已授予", Toast.LENGTH_SHORT).show()
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textview = findViewById(R.id.textview)
        findViewById<Button>(R.id.button).setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java).apply {
                putExtra("name", "第一个页面传递的数据")
            }
            myActivityLauncher.launch(intent)
        }

        findViewById<Button>(R.id.button1).setOnClickListener {
            requestOnePermission.launch(Manifest.permission.CAMERA)
        }

        findViewById<Button>(R.id.button2).setOnClickListener {
            requestMultiplePermissions.launch(
                arrayOf(
                    Manifest.permission.CAMERA,
                    Manifest.permission.RECORD_AUDIO,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
                )
            )
        }
    }

}

4. 预定义的Contract

StartActivityForResult()
RequestMultiplePermissions()
RequestPermission()
TakePicturePreview()
TakePicture()
TakeVideo()
PickContact()
CreateDocument()
OpenDocumentTree()
OpenMultipleDocuments()
OpenDocument()
GetMultipleContents()
GetContent()
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返回,应用程序可以完全管理返回目录中的文档。

上面这些预定义的Contract中,除了StartActivityForResult和RequestMultiplePermissions之外,基本都是处理的与其他APP交互,返回数据的场景,比如,拍照,选择图片,选择联系人,打开文档等等。使用最多的就是StartActivityForResult和RequestMultiplePermissions了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错?