startActivityForResult和setResult详解
原文:startActivityForResult和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_OKcase RESULT_OK:Bundle b=data.getExtras(); //data为B中回传的IntentString 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()方法好.

posted on 2017-09-20 15:08 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/7561590.html

startActivityForResult和setResult详解相关推荐

  1. setResult详解

    startActivityForResult与startActivity的不同之处在于: 1.startActivity( )  仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startA ...

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

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

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

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

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

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

  5. android最全面试题71道题 详解

    Android面试题 1. 下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D ...

  6. Android Intent机制详解

    什么是Intent  Intent 是一个将要执行的动作的抽象描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯.比如说调用startActivity()来启动一 ...

  7. Android应用开发—Intent组件详解

    转载自:Android中Intent组件详解 Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件. Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的 ...

  8. Android 系统(252)---Android:BLE智能硬件开发详解

    Android:BLE智能硬件开发详解 目录 前言 BLE是个什么鬼 BLE中的角色分工 主要的关键词和概念  GATT(Generic Attribute Profile ) Characteris ...

  9. android开发照相机啊,Android照相机开发详解(一)

    Android相机开发详解(一) Android相机开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的 ...

最新文章

  1. 当前主要使用的python版本_如何获取当前使用的Python版本信息?(代码示例)
  2. 项目交付为什么失败?-记我在某个项目中的迷思
  3. Java数据结构和算法:234树和外部存储
  4. 如何提高电脑运行速度_电脑运行速度慢的解决方法
  5. 安装 | Window下Visual Studio VS2015 VS2017 各版本下载地址
  6. SpringCloud SpringBoot 推荐
  7. python多个进度条_多个芹菜进度条
  8. numpy的通用函数:快速的元素级数组函数
  9. Python有多火,来看一份24小时榜单,从入门到进阶,赶紧收藏!
  10. 剖析Caffe源码之Net(上)---NetParameter参数
  11. Scrapy网络爬虫实战[保存为Json文件及存储到mysql数据库]
  12. 安装npm_微信小程序使用npm安装第三方库
  13. Python学习之路_day_25(面向对象之封装/多态/组合)
  14. 华为王军:未来座舱操作系统只有1个或者2个生态
  15. 从 RequireJS 到 SeaJS(3)
  16. 洛谷P4012 深海机器人问题(费用流)
  17. final修饰的对象咋办?
  18. 190729每日一句
  19. Guitar Pro如何新建吉他谱步骤
  20. mysql 联合主键 null_MySQL联合主键的索引使用

热门文章

  1. Using NUnit with Visual Studio 2005 Express Editions
  2. usaco Money system
  3. python实现三种以上判断条件_Python小课笔记--Python控制流:if逻辑判断
  4. ini文件怎么使用_ftp文件下载工具,ftp文件下载工具是怎么使用的?使用指南
  5. php ajax 概率 转盘,php+jquery实现转盘抽奖 概率可任意调
  6. 5.7版本mysql操做语法_mysql-5.7.25安装及常用语法
  7. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!
  8. java webservice序列化_java – 可以用CXF生成可序列化的类吗?
  9. 创建一个水平盒子java_盒子模型理解
  10. 三亚免税店积分抵现_又变了??三亚免税店的政策又变了~