startActivityForResult与startActivity的不同之处

startActivity( )

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

startActivityForResult( )

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

Code

跳转的时候不是采用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

重写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;
}
}

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

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

setResult()

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

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

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

我是天王盖地虎的分割线

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

最新文章

  1. Windows Phone 十九、罗盘
  2. Scrum7.0
  3. POJ 1014 Dividing(多重背包)
  4. Docker练习例子:基于 VNCServer + noVNC 构建 Docker 桌面系统
  5. kettle连接hadoop&hdfs图文详解
  6. ubuntu 创建eclipse 快捷方式
  7. Unity StrangeIoc框架 (二)
  8. js命名空间的使用
  9. 正则表达式验证数字、汉字、电话号码,email,整数,浮点数
  10. ajax传递的数据类型json传递
  11. ABP 框架从源码学习——abp框架启动核心类AbpBootstrapper(2)
  12. 想进大厂,想收获高薪offer,资深猎头告诉你怎么做......
  13. bootstrap图片轮播
  14. ICE的异步方法调用
  15. 作为一名程序员,在面试中如何展现你Python的coding能力?
  16. Python高阶函数map、reduce、filter、sorted的应用
  17. socket模块粘包现象理解以及解决思路
  18. Android studio 创建安卓项目hello
  19. shell 杀掉指定进程的服务
  20. 解决执行脚本报syntax error: unexpected end of file或syntax error near unexpected token `fi'错误的问题

热门文章

  1. UVALive 6913 I Want That Cake 博弈dp
  2. doc文件中的cer附件保存到本地
  3. ARM 汇编与C调用的若干问题(一般函数调用情况)
  4. 使用GIT进行源码管理——GIT托管服务2018
  5. android依据区域高度切割文本问题
  6. IBDAP-CMSIS-DAP
  7. Go 面试题(附答案解析)
  8. 《Go学习笔记 . 雨痕》方法
  9. linux搭建C开发环境
  10. ibatis.net:第二天,Hello,World ?