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事件直接自己给吞了

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

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

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5441728.html,如需转载请自行联系原作者

setResult详解相关推荐

  1. startActivityForResult和setResult详解

    startActivityForResult和setResult详解 原文:startActivityForResult和setResult详解 startActivityForResult与star ...

  2. android intent例程,Android开发(四)| 探究活动(详解Intent+大量实例)

    在Android的开发项目中,Activity(活动)是最容易吸引到用户的地方,因为相比于算法.架构,它是实际可见的. Activity是一个可以包含用户界面的组件,主要用于和用户进行交互.一个用户程 ...

  3. Web 实时消息推送详解

    title: Web 实时消息推送详解 category: 系统设计 head: meta name: keywords content: 消息推送,短轮询,长轮询,SSE,Websocket,MQT ...

  4. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(二)

    文章大纲 引言 一.DirectFragment 1.当选中DirectoryFragment中RecyclerView的Item时 2.选中DirectoryFragment中RecyclerVie ...

  5. 海康摄像头监控视频播放详解

    2019.12.09 更新(重要!!!) 一,此博文及对应代码写于2018年初,基于海康SDK V5.3.3.2版本(当时最新版本),只适用于2019年前海康监控设备:(海康监控产品更新换代,旧版SD ...

  6. 分布式中间件之Dubbo详解

    文章内容输出来源:拉勾教育Java高薪训练营 心得体会: 在拉勾教育高薪训练营里经过三个月多的学习,很辛苦但也收获很多,主要体现在:1.以前是工作遇到了哪方面的问题才去学习并解决,很难形成知识体系,在 ...

  7. nginx学习简介-安装-启动-命令-nginx配置文件详解

    nginx是什么:nginx是一个高性能的HTTP和反向代理web服务器.同时也提供了IMAP/POP3/SMTP服务. nginx特点:开源.占内存少.轻量级.高性能(有报告表面nginx能支持高达 ...

  8. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  9. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

最新文章

  1. 日常积累的一些linux和运维的东西 [转]
  2. ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 A题 Visiting Peking University
  3. 保存/恢复cxGrid布局
  4. 缓存-分布式锁-分布式锁原理与使用
  5. 1095. 山脉数组中查找目标值
  6. java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例
  7. 全国计算机二级c 笔记,[IT认证]全国计算机等级考试二级C语言笔记.doc
  8. SQL Server添加索引
  9. wp login.php 打不开,解决wordpress后台无法登录或显示空白的问题
  10. leetcode771题
  11. 简析边缘数据中心技术
  12. linux 蓝牙测试程序下载,Linux下蓝牙测试软件包和命令介绍
  13. 简单socket聊天小程序+socket简单封装
  14. Python程序员关于爬虫的一些常见面试题
  15. iframe嵌套视频,视频全屏用不了
  16. 解决USB无法识别问题
  17. 数据库 --关联查询(多表查询)
  18. 软件对硬盘性能测试,新买的固态硬盘 有哪些软件可以测试性能?
  19. 用c++写的 涂鸦跳跃 小游戏
  20. 软件即服务(saas)_什么是SaaS? 定义软件即服务

热门文章

  1. vue computed 中操作DOM和给对象添加属性遇到的问题
  2. 我的《一种前端代码质量检测方法及装置》专利申请
  3. jquery实现图片等比例缩放,解决max-width在ie中不兼容问题
  4. 初识【jQuery】,入门必看!
  5. 机场新增卫星厅对中转旅客影响的评估方法
  6. java报表的导出excel_java导出excel报表
  7. 6-1 稀疏矩阵求和 (70 分)
  8. php 405跳转,php采用curl访问域名返回405 method not allowed提示的解决方法
  9. c++switch语句中不能进行变量定义吗_Go 指南--控制流语句
  10. MySQL中通配类型各自作用_在Access数据库中。在查找操作中,通配符*、?与#各有什么作用?...