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

setResult详解

startActivityForResult与startActivity的不同之处在于
1、startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( )
可 以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个 Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的 onActivityResult( )方法。

 

相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)

 

简单例子介绍:

1.跳转的时候不是采用startActivity(intent) 这个方法,而是startActivityForResult(intent, 0)

复制代码
Intent intent=new Intent();
intent.setClass(A.this, B.class);
Bundle bundle=new Bundle(); String str1="aaaaaa"; bundle.putString("str1", str1); intent.putExtras(bundle); startActivityForResult(intent, 0);//这里采用startActivityForResult来做跳转,此处的0为一个依据,可以写其他的值,但一定要>=0
复制代码

2.重写onActivityResult方法,用来接收B回传的数据。

复制代码
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK case RESULT_OK: Bundle b=data.getExtras(); //data为B中回传的Intent String str=b.getString("str1");//str即为回传的值 break; default: break; } }
复制代码

3.在B中回传数据时采用setResult方法,并且之后要调用finish方法。

setResult(RESULT_OK, intent); //intent为A传来的带有Bundle的intent,当然也可以自己定义新的Bundle
finish();//此处一定要调用finish()方法

 

Android activity的setResult()在什么时候调用(重点也是难点)

如果在startActivityForResult起来的 Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,结果才会 被发送给parent的onActivityResult去处理!

如果一个activity要返回数据到启动它的那个activity,可以调用setResult()方法。那什么时候去调用setResult()方法返回数据呢?
看一下源码就明白了:

复制代码
public final void setResult(int resultCode, Intent data) {
        synchronized (this) { mResultCode = resultCode; mResultData = data; } } public void finish() { if (mParent == null) { int resultCode; Intent resultData; synchronized (this) { resultCode = mResultCode; resultData = mResultData; } if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken); try { if (ActivityManagerNative.getDefault() .finishActivity(mToken, resultCode, resultData)) { mFinished = true; } } catch (RemoteException e) { // Empty  } } else { mParent.finishFromChild(this); } }
复制代码

这段代码可以看出activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的

按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
解决方法就是在Activity里面捕获按BACK的事件,捕获到之后先setResult,然后自己来调用finish,就搞定了……把BACK事件直接自己给吞了

@Override
    public void onBackPressed() {
        Log.i(TAG, "onBackPressed");
        setResult(Const.LIVE_OK);
        super.onBackPressed(); }

当然还可以在onCreate()就调用setResult,不过我觉得这种方法没有重写onBackPressed()方法好.

相关文章:

  • JavaEE 要懂的小事:二、图解 Cookie(小甜饼)
  • 数据库的元数据及事务
  • WinForm输入网址打开源码
  • vector,map 注意事项
  • Atiti. Php Laravel 5.1 环境搭建以及  error 排除
  • tomcat配置文件server.xml详解
  • Nodejs和JavaWeb协助开发
  • JAVA 位操作学习
  • idea演示
  • F5 实现pool池转发
  • ie7下a/a标签不反应
  • MapReduce编程实例
  • iOS开发数据库篇—SQLite简单介绍
  • iOS开发拓展篇—音效的播放
  • 基于COOKIE的点击流数据仓库构建思路(一)
  • $translatePartialLoader加载失败及解决方式
  • JavaScript 基础知识 - 入门篇(一)
  • jquery ajax学习笔记
  • js
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Laravel 实践之路: 数据库迁移与数据填充
  • Phpstorm怎样批量删除空行?
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 包装类对象
  • 多线程事务回滚
  • 翻译--Thinking in React
  • 构建工具 - 收藏集 - 掘金
  • 什么是Javascript函数节流?
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #stm32驱动外设模块总结w5500模块
  • %@ page import=%的用法
  • (33)STM32——485实验笔记
  • (HAL库版)freeRTOS移植STMF103
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (力扣题库)跳跃游戏II(c++)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)kafka实战——kafka源码编译启动
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .axf 转化 .bin文件 的方法
  • .net core 连接数据库,通过数据库生成Modell
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 知识杂记
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net生成的类,跨工程调用显示注释
  • // an array of int
  • ??javascript里的变量问题
  • @Validated和@Valid校验参数区别
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [51nod1610]路径计数
  • [AutoSar]BSW_OS 02 Autosar OS_STACK