Android startActivityForResult和setResult的区别

发布时间 - 2026-01-11 03:00:59    点击率:

 Android 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_OK
  case RESULT_OK:
  Bundle b=data.getExtras(); //data为B中回传的Intent
  String 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事件直接自己给吞了

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

当然还可以在onCreate()就调用setResult,不过我觉得这种方法没有重写onBackPressed()方法好.

 以上就是Android startActivityForResult和setResult的区别,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # startActivityForResult和setResult的对比  # startActivityForResult和setResult的区别  # Android startActivityForResult的调用与封装详解  # Android startActivityForResult的基本用法详解  # Android利用startActivityForResult返回数据到前一个Activity  # Android startActivityForResult实例详解  # Android基础之startActivityForResult()的用法详解  # Android startActivityForResult()代替方案示例  # 回传  # 是在  # 跳转  # 什么时候  # 这段  # 重写  # 跳转到  # 的是  # 就会  # 也有  # 我在  # 还可以  # 我觉得  # 也就  # 如有  # 才会  # 其他的  # 希望能  # 仅仅是  # 可以看出 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高防服务器:AI智能防御DDoS攻击与数据安全保障  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel如何实现API速率限制?(Rate Limiting教程)  Java类加载基本过程详细介绍  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Linux安全能力提升路径_长期防护思维说明【指导】  Python文件操作最佳实践_稳定性说明【指导】  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  装修招标网站设计制作流程,装修招标流程?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  详解Huffman编码算法之Java实现  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  在Oracle关闭情况下如何修改spfile的参数  如何生成腾讯云建站专用兑换码?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Python文本处理实践_日志清洗解析【指导】  利用python获取某年中每个月的第一天和最后一天  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  Python结构化数据采集_字段抽取解析【教程】  android nfc常用标签读取总结  Laravel如何使用Sanctum进行API认证?(SPA实战)  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  海南网站制作公司有哪些,海口网是哪家的?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何在万网ECS上快速搭建专属网站?  iOS中将个别页面强制横屏其他页面竖屏  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel怎么上传文件_Laravel图片上传及存储配置  高端建站三要素:定制模板、企业官网与响应式设计优化  如何撰写建站申请书?关键要点有哪些?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel如何使用withoutEvents方法临时禁用模型事件  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  网站建设保证美观性,需要考虑的几点问题!  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何在阿里云虚拟主机上快速搭建个人网站?  如何自定义建站之星网站的导航菜单样式?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何在万网利用已有域名快速建站?  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  ,交易猫的商品怎么发布到网站上去?  如何在宝塔面板创建新站点?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能