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 -> }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库