`

Android学习 之 startActivityForResult 和 onActivityResult

阅读更多

在交互实现的过程里,发现之前自己对Activity生命周期和Intent 传递数据的Bundle理解有些偏差。


举例说我想要做的一个事情是,在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity处理。
 
参考了网上的一些资料,不啰嗦,马上贴代码
 
/*****************************/ 华丽丽的分割线 /*****************************/

目的: A.java 是主界面,B.java 是子功能模块,要从A启动B,B干完活之后把结果汇报给A
先看 A.java 的相关代码

//-- A.java --//
/*
 * 要做两件事情,第一是用 startActivityForResult() 启动B,其次是回收B的结果
 */
//启动B
Intent bintent = new Intent(A.this, B.class);
//设置 bintent的Bundle的一个值
String bsay = "Hello, this is B speaking"; 
bintent.putExtra("listenB", bsay)
startActivityForResult(bintent,0); // 参数(Intent intent, Int requestCode) 的 requestCode 对应下面回收Bundle时识别用的

//重写onActivityResult()来处理返回的数据,建议先看B.java 的代码再回来看这里比较好理解
//这理有三个参数 requestCode, resultCode, data
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("ListenB");//str即为回传的值"Hello, this is B speaking"
/* 得到B回传的数据后做什么... 略 */
                      break;
default:
          break;
}
}

-------------------------------------------------------------------------------------
//-- B.java --//
// 用 setResut() 准备好要回传的数据后,只要使用finish()的方法就能把打包好的数据发给A且运行onActivityResult()部分的代码

Intent aintent = new Intent(B.this, A.class);
/* 将数据打包到aintent Bundle 的过程略 */
setResut(RESULT_OK,aintent); //这理有2个参数(int resultCode, Intent intent)
... ...
finish();

-------------------------------------------------------------------------------------
OK,代码如上,可能这个时候还会有点疑问,关于参数的疑问。直接看android sdk 帮助说得更清楚。我发现网上有些文章还有吧 requestCode 和 resultCode 混淆说明错的。
startActivityForResult(Intent intent,Int requestCode)
intent 传给B的,不解释,看不懂你还是玩玩手机算了,别想开发的事情了
requestCode >=0就好,随便用于在onActivityResult()区别哪个子模块回传的数据,如果还有C.java ,D甚至E子模块的话,每个区分开不同的requestCode就好。

setResut(int resultCode, Intent intent)
resultCode 如果B子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。这里还有个特殊的 RESULT_OK 值,没有特殊情况用它就好了,sdk有说明的,呵。
intent 继续不解释,传回给A的onActivityResult()

onActivityResult(int requestCode, int resultCode, Intent intent)
这里三个都不用解释了,与上文对应的东西。如果不对requestCode和resultCode 加以识别区分的话,只要有其他activity setResult到了A  onActivityResult()会无差别处理。
分享到:
评论

相关推荐

    Android-基于RxPermissions框架思想在使用startActivityForResult可以不重写onActivityResult回调

    基于RxPermissions框架思想,在使用startActivityForResult可以不重写onActivityResult回调

    Android OnActivityResultDemo

    这个结果码必须为RESULT_OK,因为Activity A的onActivityResult()会依次判断结果码和请求码,只有都符合的时候,OK,我们可以从onActivityResult()的参数Intent data中获取数据啦,这个data就是Activity B中的Intent...

    告别onActivityResult 工具类DEMO

    告别onActivityResult ,用代理实现获取startActivityForResult结果以及权限检查管理的工具类

    android activity跳转 Application Context实现共享数据

    涉及:activity跳转、intent使用、startActivityForResult/onActivityResult,着重讲解通过来Application Context实现共享数据

    Android巧用Fragment解耦onActivityResult详解

    最近在研究jsbridge, 一直在想怎么样才能让需要startActivityForResult比如打开相机拍照这样的操作在webView中能更简单一点, 直到我发现了这篇文章 两个类,让你再也不用实现onActivityResult() 看了之后, 马上模仿...

    安卓应用之Activity数据传递

    使用startActivityForResult和onActivityResult的方法来启动Activity,发送数据以及接收数据返回。 使用onActivityResult中的形参,实现标准的处理流程。 代码中Tag,RequestCode,ResultCode能标记性数值,需要在...

    Android onActivityResult和setResult方法详解及使用

    Android onActivityResult和setResult方法  最近做公司项目遇到Android onActivityResult和setResult ,在应用过程中进程报错,这里有必要记录下,以免再次使用出错。 如果你想在Activity中得到新打开Activity关闭...

    Android中Fragment多层嵌套时onActivityResult无法正确回调问题的解决方法

    Fragment也可以使用startActivityForResult方法去打开一个Activity,然后在其onActivityResult方法中处理结果,可是当Fragment嵌套的时候,由于FragmentActivity的BUG导致只会回调最外那层Fragment的...

    Android4.0入门之Activity返回参数

    Activity返回参数和传值区别:传参调用startActivity(intent)执行跳转,返回参数用startActivityForResult(intent, 1)方法,还需从写onActivityResult()方法,它是负责初始化回传参数的方法。

    Android实现图片自动轮换

    startActivityForResult(intent, REQUEST_PICTURE_CHOOSE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK){ Uri uri...

    轮子哥安卓开发框架,非常好用

    优秀的代码设计:AndroidProject 对 startActivityForResult 的设计进行了改良,使得可以直接在方法上传入监听对象,这样我们就不需要重写 onActivityResult 方法来拿到回调,另外原生的 startActivityForResult 还...

    Android代码-AvoidOnResult

    无需重写onActivityResult,以回调的方式拿到startActivityForResult的结果,解决了以往跳转页面和处理结果分离的痛点。 同时无需重写onActivityResult也意味着只要你可以拿到一个Activity实例,就可以通过它...

    Android 从Activity中返回数据

    而且要从Activity中返回数据,虽然返回数据和传递数据类似,也可以采用前面4种方法,但是一般建议采用Intent对象的方式来返回数据,使用这种方式返回数据,需要使用startActivityForResult方法来显示Activity ...

    Android代码-多图片选择器~

    Smart Gallery with Single and Multiple image pick action. Features luminous.ACTION_PICK for choosing single image. ... protected void onActivityResult(int requestCode, int resultCode, Intent data

    Android 实例讲解添加本地图片和调用系统拍照图片

    添加本地图片和调用系统拍照图片主要是通过调用acitivity跳转startActivityForResult Intent intent int requestCode 方法和activity返回结果onActivityResult int requestCode int resultCode Intent data 方法来...

    Android代码-MutiPhotoChoser一款支持多选的图片选择器

    一款支持多选的图片选择器,支持Android2.0 使用(详见app目录) 配置AndroidManifest.xml 1、添加权限: <!--SD卡读写权限--> 2、声明GalleryActivity: <!--***改成应用的包名--> 调起...

    Android使用Intent实现页面跳转

    由Intent来协助完成Android各个组件之间的通讯 Intent实现页面之间的跳转 1>startActivity(intent) 2>startActivityForResult(intent,requestCode) onActivityResult(int requestCode,int resultCode,Intent ...

    Android代码-Imaging

    Imaging 一款图片编辑类库,功能类似微信中图片编辑功能,其主要目标用于聊天中快速编辑图片。 包含以下主要功能: 缩放 涂鸦 文字 马赛克 ...fun onChooseImages(uri: ...override fun onActivityResult(requestCode:

    Android Camera Example

    Android开发 通过Intent 调用Camera应用 sample code 程序调用startActivityForResult(Intent, int, Bundle) 接口启动相应的应用程序, 并且必须Activity实现 onActivityResult() 来接受调用相应的Camera应用...

    Android实验报告—网络通信.doc

    } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode){ case SUBACTIVITY1: if (resultCode == ...

Global site tag (gtag.js) - Google Analytics