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()方法好.
转载于:https://www.cnblogs.com/lonelyxmas/p/7561590.html
startActivityForResult和setResult详解相关推荐
- setResult详解
startActivityForResult与startActivity的不同之处在于: 1.startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startA ...
- android intent例程,Android开发(四)| 探究活动(详解Intent+大量实例)
在Android的开发项目中,Activity(活动)是最容易吸引到用户的地方,因为相比于算法.架构,它是实际可见的. Activity是一个可以包含用户界面的组件,主要用于和用户进行交互.一个用户程 ...
- Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(二)
文章大纲 引言 一.DirectFragment 1.当选中DirectoryFragment中RecyclerView的Item时 2.选中DirectoryFragment中RecyclerVie ...
- 海康摄像头监控视频播放详解
2019.12.09 更新(重要!!!) 一,此博文及对应代码写于2018年初,基于海康SDK V5.3.3.2版本(当时最新版本),只适用于2019年前海康监控设备:(海康监控产品更新换代,旧版SD ...
- android最全面试题71道题 详解
Android面试题 1. 下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D ...
- Android Intent机制详解
什么是Intent Intent 是一个将要执行的动作的抽象描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯.比如说调用startActivity()来启动一 ...
- Android应用开发—Intent组件详解
转载自:Android中Intent组件详解 Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件. Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的 ...
- Android 系统(252)---Android:BLE智能硬件开发详解
Android:BLE智能硬件开发详解 目录 前言 BLE是个什么鬼 BLE中的角色分工 主要的关键词和概念 GATT(Generic Attribute Profile ) Characteris ...
- android开发照相机啊,Android照相机开发详解(一)
Android相机开发详解(一) Android相机开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的 ...
最新文章
- 当前主要使用的python版本_如何获取当前使用的Python版本信息?(代码示例)
- 项目交付为什么失败?-记我在某个项目中的迷思
- Java数据结构和算法:234树和外部存储
- 如何提高电脑运行速度_电脑运行速度慢的解决方法
- 安装 | Window下Visual Studio VS2015 VS2017 各版本下载地址
- SpringCloud SpringBoot 推荐
- python多个进度条_多个芹菜进度条
- numpy的通用函数:快速的元素级数组函数
- Python有多火,来看一份24小时榜单,从入门到进阶,赶紧收藏!
- 剖析Caffe源码之Net(上)---NetParameter参数
- Scrapy网络爬虫实战[保存为Json文件及存储到mysql数据库]
- 安装npm_微信小程序使用npm安装第三方库
- Python学习之路_day_25(面向对象之封装/多态/组合)
- 华为王军:未来座舱操作系统只有1个或者2个生态
- 从 RequireJS 到 SeaJS(3)
- 洛谷P4012 深海机器人问题(费用流)
- final修饰的对象咋办?
- 190729每日一句
- Guitar Pro如何新建吉他谱步骤
- mysql 联合主键 null_MySQL联合主键的索引使用
热门文章
- Using NUnit with Visual Studio 2005 Express Editions
- usaco Money system
- python实现三种以上判断条件_Python小课笔记--Python控制流:if逻辑判断
- ini文件怎么使用_ftp文件下载工具,ftp文件下载工具是怎么使用的?使用指南
- php ajax 概率 转盘,php+jquery实现转盘抽奖 概率可任意调
- 5.7版本mysql操做语法_mysql-5.7.25安装及常用语法
- 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!
- java webservice序列化_java – 可以用CXF生成可序列化的类吗?
- 创建一个水平盒子java_盒子模型理解
- 三亚免税店积分抵现_又变了??三亚免税店的政策又变了~