Activity Result API详解

  以下学习自https://blog.csdn.net/guolin_blog/article/details/121063078?spm=1001.2014.3001.5501

  startActivityForResult()方法如今已经被废弃了,官方推荐的是使用Activity Result API来实现两个Activity之间传递数据功能。但Activity Result API时能做的事还有很多,下面来学习一下怎么使用。

两个Activity之间交换数据

  传统的写法就是使用startActivityForResult()方法传入intent和请求码,然后会回调到onActivityResult()中,在这里面进行返回数据的处理。使用Activity Result API的话,SecondActivity的代码是不用修改的,如下:

复制代码
class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        val btn = findViewById<Button>(R.id.btn)
        btn.setOnClickListener {
            val intent = Intent()
            intent.putExtra("data", "this is secondactivity")
            setResult(RESULT_OK, intent)
            finish()
        }
    }
}
复制代码

 

 

  只需要修改第一个Activity中的代码:

复制代码
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.toNext.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            requestDataLauncher.launch(intent)
        }
    }
    private val requestDataLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
            val data = result.data?.getStringExtra("data")
            Log.i(TAG, data.toString())
        }
    }
复制代码

  现在只需要调用registerForActivityResult()方法来注册一个对Activity结果的监听。

  此方法接收两个参数,第一个是Contract类型,第二个是一个Lambda表达式,当有结果返回时会回调到这里,在这里获取并处理数据就行。

 

请求运行时权限

  requestPermissions()方法也被废弃了。同样推荐使用Activity Result API,不过这挺好,使用起来非常简单。如下:

复制代码
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.toNext.setOnClickListener {
            requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
        }
    }
    private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
        if (granted) {
            Log.i(TAG, "允许: ")
        } else {
            Log.i(TAG, "不允许: ")
        }
    }
复制代码

  使用同样的方法,只不过需要将Contract类型改成RequestPermission,同时修改传入的参数。至于每种Contract需要传入什么类型的参数,可以前往它的源码查看,比如上面这个:

    public static final class RequestPermission extends ActivityResultContract<String, Boolean> {

  第一个String就是请求的权限名,第二个就是布尔类型的参数作为返回结果。

  对了,别忘了去AndroidManifest中添加用户权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

 

内置Contract

  以下是内置的一些Contract,通过名字就能判断出是干什么的了:

复制代码
StartActivityForResult()
StartIntentSenderForResult()
RequestMultiplePermissions()
RequestPermission()
TakePicturePreview()
TakePicture()
TakeVideo()
PickContact()
GetContent()
GetMultipleContents()
OpenDocument()
OpenMultipleDocuments()
OpenDocumentTree()
CreateDocument()
复制代码

 

 

区分数据来源

  当一个Activity需要接收其他多个Activity的结果时,由于没有requestCode,所以就要采用为每个结果注册一个监听器,如下:

复制代码
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.toSecond.setOnClickListener {
            val intent = Intent(Intent.ACTION_VIEW)
            actionViewLauncher.launch(intent)
        }
        binding.toThree.setOnClickListener {
            val intent = Intent(Intent.ACTION_DIAL)
            actionDailLauncher.launch(intent)
        }

    }

    private val actionViewLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->

    }
    private val actionDailLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->

    }
复制代码

 

posted @   PeacefulGemini  阅读(964)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
回顶部
点击右上角即可分享
微信分享提示