Activity Result API 入门:Android 新版 Activity 返回结果机制详解
文章目录为什么旧方案被弃用Activity Result API 的核心组成注册 LauncherLauncher 到底是什么启动目标 Activity在第二个 Activity 中返回结果回调中的 result 是什么resultCodedata为什么 registerForActivityResult 要放在 onCreate 中数据是如何返回的Activity Result API 的完整流程总结在学习 Android 的 Activity 通信时最先接触到的通常是Intent和putExtra()。启动另一个 Activity 很简单但如果希望打开一个 Activity等待它处理完成再把结果返回给当前 Activity事情就会稍微复杂一些。很多教材仍然使用startActivityForResult()和onActivityResult()但这套方案已经被官方弃用。现在 Android 推荐使用Activity Result API它不仅写法更清晰也更符合 Activity 生命周期的设计。本文从基础开始结合完整代码一步步理解 Activity Result API 的工作方式。为什么旧方案被弃用旧版写法大致如下startActivityForResult(intent,100);然后在当前 Activity 中重写OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){...}所有返回结果都会集中到这一个方法中再根据requestCode判断是谁返回的。当项目变大之后一个 Activity 可能启动很多不同的页面onActivityResult()会越来越长需要不断写if或switch判断代码可读性和维护性都会变差。Activity Result API 的思路是谁发起请求谁直接注册回调处理结果。这样结果处理逻辑就和启动逻辑放在一起不再需要统一集中处理。Activity Result API 的核心组成整个 API 只有三个核心部分。首先是Launcher。Launcher 可以理解成一个“启动器”专门负责启动某种操作例如启动另一个 Activity、打开相册、请求权限等。其次是ContractActivityResultContract。Contract 用来规定启动时需要传什么参数返回时会得到什么类型的数据。最后是回调函数。当目标 Activity 结束后系统会自动调用回调把结果交给当前 Activity。整个流程可以概括为注册 Launcher↓launch()↓启动目标 Activity↓目标 Activity 返回结果↓自动执行回调注册 Launcher先创建一个简单的页面。MainActivity 中放一个按钮publicclassMainActivityextendsAppCompatActivity{privateActivityResultLauncherIntentlauncher;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);launcherregisterForActivityResult(newActivityResultContracts.StartActivityForResult(),result-{if(result.getResultCode()RESULT_OK){Intentdataresult.getData();Stringtextdata!null?data.getStringExtra(result):null;Toast.makeText(this,text,Toast.LENGTH_SHORT).show();}});findViewById(R.id.btnOpen).setOnClickListener(v-{IntentintentnewIntent(this,SecondActivity.class);launcher.launch(intent);});}}这里最重要的是registerForActivityResult(...)这个方法完成了 Launcher 的注册。它需要两个参数registerForActivityResult(contract,callback)第一个参数是 Contract。newActivityResultContracts.StartActivityForResult()表示启动一个普通 Activity并等待它返回结果。第二个参数是回调函数。当 SecondActivity 结束时这里的代码会自动执行。Launcher 到底是什么很多初学者看到privateActivityResultLauncherIntentlauncher;容易不理解这个类型。实际上ActivityResultLauncherIntent表示这是一个可以接收 Intent 参数的启动器。因为StartActivityForResult()的输入类型就是Intent。所以后面启动时launcher.launch(intent);相当于把 Intent 交给 LauncherLauncher 再交给系统系统启动目标 ActivityLauncher 本身不负责页面逻辑它只是一个符合生命周期的启动入口。启动目标 Activity启动代码非常简单IntentintentnewIntent(this,SecondActivity.class);launcher.launch(intent);这里已经不需要startActivityForResult();只需要launch(intent);即可。在第二个 Activity 中返回结果创建 SecondActivitypublicclassSecondActivityextendsAppCompatActivity{OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);findViewById(R.id.btnFinish).setOnClickListener(v-{IntentintentnewIntent();intent.putExtra(result,来自 SecondActivity 的数据);setResult(RESULT_OK,intent);finish();});}}这里和旧版写法几乎完全一样。返回结果依然使用setResult(resultCode,data);然后调用finish();回调中的 result 是什么注册时, 这里的result类型是ActivityResult, 它主要有两个获取方法result.getResultCode()result.getData()resultCode用于判断目标 Activity 是否成功返回。最常见的是RESULT_OKRESULT_CANCELED因此通常会先判断if(result.getResultCode()RESULT_OK)datadata本质上就是一个Intent。所以可以继续Stringtextresult.getData()!null?result.getData().getStringExtra(result):null;和普通 Intent 取值方式完全一致。为什么 registerForActivityResult 要放在 onCreate 中很多人第一次使用时会疑惑为什么不能点击按钮时再注册button.setOnClickListener(v-{registerForActivityResult(...)});这样是不允许的。Launcher 必须在Activity 生命周期开始阶段完成注册。因为系统需要提前知道谁负责接收结果Activity 重建后如何恢复回调。所以官方要求registerForActivityResult()必须在 Activity 或 Fragment 创建过程中调用。通常写在onCreate()数据是如何返回的很多人会产生一个误解是不是第二个 Activity 直接把变量传回来了其实不是。整个过程依然依赖Intent。SecondActivityIntentintentnewIntent();intent.putExtra(result,Hello);setResult(RESULT_OK,intent);系统会保存这个 Intent。finish(); 执行后MainActivity 回调中result.getData()拿到的就是刚才那个 Intent。putExtra()↓Intent↓setResult()↓系统保存↓ActivityResult.getData()↓getStringExtra()和普通 Intent 传值原理是一致的。Activity Result API 的完整流程把前面的内容串起来整个流程如下。MainActivitypublicclassMainActivityextendsAppCompatActivity{privateActivityResultLauncherIntentlauncher;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);launcherregisterForActivityResult(newActivityResultContracts.StartActivityForResult(),result-{if(result.getResultCode()RESULT_OK){Stringtextresult.getData()!null?result.getData().getStringExtra(result):null;Toast.makeText(this,text,Toast.LENGTH_SHORT).show();}});findViewById(R.id.btnOpen).setOnClickListener(v-{IntentintentnewIntent(this,SecondActivity.class);launcher.launch(intent);});}}SecondActivitypublicclassSecondActivityextendsAppCompatActivity{OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);findViewById(R.id.btnFinish).setOnClickListener(v-{IntentintentnewIntent();intent.putExtra(result,来自 SecondActivity 的数据);setResult(RESULT_OK,intent);finish();});}}运行过程点击按钮↓launcher.launch(intent)↓打开 SecondActivity↓点击返回按钮↓setResult()↓finish()↓MainActivity 回调执行↓Toast 显示数据整个过程中不需要requestCode也不需要onActivityResult()。总结Activity Result API 并没有改变 Activity 返回结果的本质它仍然是Intent setResult() finish()。真正变化的是使用ActivityResultLauncher启动操作使用ActivityResultContract定义输入输出类型使用注册回调代替onActivityResult()。相比旧方案它最大的优势是代码更加模块化与生命周期绑定更加安全。后续学习中你会发现 Android 调用系统相册、拍照、请求权限等功能几乎都建立在 Activity Result API 的基础之上。理解本文的流程之后再学习这些新版 API 会轻松很多。

相关新闻

25 YOLOv8中Bin的偏移量是相对于谁的——网格、乘数与框大小的关系

25 YOLOv8中Bin的偏移量是相对于谁的——网格、乘数与框大小的关系

YOLOv8中Bin的偏移量是相对于谁的——网格、乘数与框大小的关系 前置文档:本文承接 第24篇,假设你已经理解"bin值固定、概率可变、加权求和"的机制。本文聚焦一个24篇没讲透的问题:bin的偏移量是相对于谁的? 一句话总结…

2026/11/10 13:50:54 阅读更多 →
C++哈希表容器unordered_set与unordered_map详解

C++哈希表容器unordered_set与unordered_map详解

1. 无序容器概述:为什么需要hash表?在C标准库中,unordered_set和unordered_map是基于哈希表实现的关联容器。与基于红黑树的有序容器(set/map)相比,它们通过牺牲元素排序性换取了O(1)时间复杂度的查找性能。…

2026/11/8 16:38:27 阅读更多 →
英雄联盟豹女陷阱流玩法解析:符文出装与实战博弈

英雄联盟豹女陷阱流玩法解析:符文出装与实战博弈

在实际《英雄联盟》对局中,豹女(奈德丽)因其高机动性和爆发伤害,一直是高分段和打野玩家热衷的英雄。但“氪金大佬陷阱流”这个说法,通常指代一种高风险、高回报的玩法思路:通过投入大量经济购买特定装备&a…

2026/11/2 19:48:24 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/9 14:01:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/9 14:56:39 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/10 2:03:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/9 14:01:10 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/10 12:51:50 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/9 14:01:11 阅读更多 →

日新闻

周新闻

月新闻