当前位置: 首页 > news >正文

【Android关键字】startActivityForResult/onActivityResult/setResult方法的使用

最近在写一个安卓程序,在程序里需要用到startActivityForResult这个Intent操作关键字,与该关键字有关的还有onActivityResult和setResult。这里对其用法进行一个总结。

三者在API中的形式

//startActivityForResult与startActivity类似,只不过该方法可将方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。
startActivityForResult(Intent intent, int requestCode)
onActivityResult(int requestCode, int resultCode, Intent data)
setResult(int resultCode, Intent data)

三者组合的作用

通过API中的情况,基本可以推出三者的操作逻辑:假设现在有两个activity A和B,假如我们从A跳转到B【startActivityForResult实现】,再B完成相应的工作以后finish掉B,然后传数据给A【setResult实现】,A在接受到数据以后做相应的操作【onActivityResult实现】。其操作逻辑可以用以下代码来表示:

A//启动B
Intent intent = new Intent();
intent.setClass(A.this, B.class);
//1是我们自己定义常量,用于标注由A->B这个活动,对应下面使用到的onActivityResult中的requestCode
startActivityForResult(intent, 1);
B//do something
//此方法中的 1 表示onActivityResult的resultCode,一般也用 RESULT_OK(1)和RESULT_CANCELED(0)表示,data一般为 Intent类型的数据,也可以为 null
setResult(1, data);
finish();

然后由活动B再返回A执行onActivityResult方法。

代码示例

ActivityA.Java中的代码:

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent("com.example.activitytest.ACTTON_START");startActivityForResult(intent,1);//打开活动B}});

ActivityB.java代码

在活动B中用 setResult 方法设置好要返回的结果,setResult()接收两个参数,第一个是活动返回处理结果,一般只是用RESULT_OK和RESULT_CANCELED,另一个这是将带有数据的Intent传递回去。

button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent();intent.putExtra("data_return","测试一下");//要返回的结果setResult(RESULT_OK,intent);finish();//销毁活动B}});

在活动B被销毁后 ,会回调上一个活动(即活动A)的onActivityResult()方法(想要在活动A中获取传递的结果,就需要覆写该方法)。

@Override   //                        请求码          处理结果          带返回数据的Intent                  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {if(data!=null){switch (requestCode){case 1 :if(resultCode == RESULT_OK){String returnData = data.getStringExtra("data_return");Log.d("MainActivity",returnData);}break;default:}}else{return ;}

这样在活动B被销毁后,就会回到活动A,获取到活动B返回的数据了。但在用户如果在活动B并没有定义按钮button2,而是按下Back按键,这时候在 ActivityB.java中覆写 onBackPressed()方法。

            @Overridepublic void onBackPressed() {Intent intent = new Intent();intent.putExtra("data_return","测试一下");setResult(RESULT_OK,intent);finish();}});

需要注意的是,应该关注到在返回 ActivityA.java 时,onActivityResult中 需要判断 data 与 null 的关系,这样子有助于程序的稳健性。

http://www.lryc.cn/news/94841.html

相关文章:

  • PyTorch深度学习实战(5)——计算机视觉
  • 遥感目标检测(1)--R3Det
  • 使用 vue3-tel-input电话组件时,为什么通过v-model绑定的默认值无效而 通过:value绑定有效?
  • 【运维工程师学习二】OS系统管理
  • 【前端技巧】CSS常用知识碎片(九)
  • SQL 上升的温度
  • Matlab实现最优化(附上多个完整仿真源码)
  • es下载历史的tar文件
  • 顺畅下载chatglm2-6b的模型文件
  • go语言 socket: too many open files 错误分析
  • 分布式搜索--elasticsearch
  • UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(一)
  • 500万PV的网站需要多少台服务器?
  • 拖动排序功能的实现 - 使用HTML、CSS和JavaScript
  • 【STM32MP135 - ST官方源码移植】第三章:OPTEE源码移植教程
  • 云主机安全-私有密钥安全认证
  • 《Web安全基础》02. 信息收集
  • ffmpeg根据原始视频的帧率进行提取视频帧
  • 从零搭建秒杀服务
  • 数据库应用:CentOS 7离线安装PostgreSQL
  • 【PHP面试题42】Laravel依赖注入实现的原理是怎么样的
  • 如何在本地组策略编辑器中启用或禁用剪贴板历史记录
  • 如何与ChatGPT愉快地聊天
  • 使用Gradio库进行交互式数据可视化:Timeseries模块介绍
  • CONTAINER = ALL是ALTER USER语句的默认值
  • 华为发布大模型时代AI存储新品
  • 5G网络功能介绍
  • 笙默考试管理系统-MyTestMean(13)
  • Tomcat之高可用配置
  • IDEA中springboot的热加载thymeleaf静态html页面