startActivityForResult与startActivity的不同之处

  1. startActivity( )

仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。

  1. startActivityForResult( )

可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

Code

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

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

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

  1. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  2. switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK
  3. case RESULT_OK:
  4. Bundle b=data.getExtras(); //data为B中回传的Intent
  5. String str=b.getString("str1");//str即为回传的值
  6. break;
  7. default:
  8. break;
  9. }
  10. }

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

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

setResult()

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

  1. public final void setResult(int resultCode, Intent data) {
  2. synchronized (this) {
  3. mResultCode = resultCode;
  4. mResultData = data;
  5. }
  6. }
  7.  
  8. public void finish() {
  9. if (mParent == null) {
  10. int resultCode;
  11. Intent resultData;
  12. synchronized (this) {
  13. resultCode = mResultCode;
  14. resultData = mResultData;
  15. }
  16. if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
  17. try {
  18. if (ActivityManagerNative.getDefault()
  19. .finishActivity(mToken, resultCode, resultData)) {
  20. mFinished = true;
  21. }
  22. } catch (RemoteException e) {
  23. // Empty
  24. }
  25. } else {
  26. mParent.finishFromChild(this);
  27. }
  28. }

这段代码可以看出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事件直接自己给吞了

  1. @Override
  2. public void onBackPressed() {
  3. Log.i(TAG, "onBackPressed");
  4. setResult(Const.LIVE_OK);
  5. super.onBackPressed();
  6. }

我是天王盖地虎的分割线

参考:http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html

Android -- startActivityForResult-------&&&----setResult的更多相关文章

  1. Android -- startActivityForResult和setResult

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

  2. android: startActivityForResult用法详解

    一.如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode ...

  3. android startActivityForResult的用法

    有时候我们需要把A activity提交数据给B  activity处理,然后把结果返回给A 这种方式在很多种情况需要用到,比如我应用的程序需要有拍照上传的功能. 一种解决方案是  我的应用程序 〉调 ...

  4. android startActivityForResult(Intent intent, int requestCode) 整理与总结! .

    假设有两个Activity,主界面A,功能界面B,由A启动B,并传数据给B,B在经过处理后把数据传回给A. 先是A传B: Bundle bundle = new Bundle();bundle.put ...

  5. Android startActivityForResult 回传数据

    一个activity打开新的activity,新的activity关闭之后,返回数据.原来的activity要接收返回的数据,在开启新的activity时,就需要调用startActivityForR ...

  6. android startActivityForResult()

    举例说我想要做的一个事情是,在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Act ...

  7. android startActivityForResult 使用实例

    ActivityForResult.java public class ActivityForResult extends Activity { Button bn; EditText city; @ ...

  8. 一个调用其他activity的完整例子,使用了 onActivityResult和startActivityForResult

    https://blog.csdn.net/qq_32521313/article/details/52451364 Android startActivityForResult基本用法2016年09 ...

  9. 收藏的技术文章链接(ubuntu,python,android等)

    我的收藏 他山之石,可以攻玉 转载请注明出处:https://ahangchen.gitbooks.io/windy-afternoon/content/ 开发过程中收藏在Chrome书签栏里的技术文 ...

  10. 这些情况下onReume不应该是你的选择

    面试Android程序员的时候问过以下几个基本问题,得到的回答经常不尽人意: 1, Activity A跳转到Activity B,Activity B完成后,Activity A要刷新一下自己的数据 ...

随机推荐

  1. C#调用java类、jar包方法

    一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中tes ...

  2. Javascript高级程序设计——垃圾收集

    javascipt具有自动垃圾回收机制 局部变量只在函数执行过程中存在,在这个过程中,会为局部变量在栈上(或堆)内存分配相应空间,来储存他们的值,当函数执行完,局部变量就没有存在的必要了,所以这个时候 ...

  3. [原创]使用java批量修改文件编码(ANSI-->UTF-8)

    从网上下载的项目,有时候.java文件的编码是ANSI.导入到自己的MyEclipse后,查看项目源码的时候,总是乱码. 一个个.java去修改的话, 既麻烦又不现实.所以写了下面这个工具类,进行批量 ...

  4. 极客DIY:制作一个可以面部、自主规划路径及语音识别的无人机

    引言 现在大部分无人机厂商都会为第三方开发者提供无人机API接口,让他们更容易地开发无人机飞行控制应用程序,让无人机想怎么玩就怎么玩.有的API接口可以帮助开发者开发基于Web版的APP.手机APP甚 ...

  5. dtw算法

                              dtw路径与线性变换路径对比 转自:http://baike.baidu.com/link?url=z4gFUEplOyqpgboea6My0mZP ...

  6. 网站标签栏ico设置代码

    放在公共文件的header中 <link rel="Shortcut Icon" href="{APP_PATH}favicon.ico" />

  7. ubuntu彻底卸载mysql

    1.删除mysql sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-server sudo apt ...

  8. LUA+resty 搭建验证码服务器

    使用Lua和OpenResty搭建验证码服务器 雨客 2016-04-08 16:38:11 浏览2525 评论0 云数据库Redis版 摘要: Lua下有个Lua-GD图形库,通过简单的Lua语句就 ...

  9. jquery checkbox 限制多选的个数

    2015年11月6日 16:32:49 选中第四个的时候提示超过了3个, 点解alert框取消后, 将最后一个选中的checkbox取消选中 <script> $(document).re ...

  10. zpf 路由功能

    2015-4-11 20:51:06 又搞了一天, 解决了一堆bug, 重新规划了类文件夹, 改善自动加载功能 最新的特性就是支持子域名路由了 因为整个框架还在完善当中, 而且里边有好多接口有我自己申 ...