文档章节

startActivityForResult与startActivity的不同之处

Carbenson
 Carbenson
发布于 2015/06/17 23:32
字数 739
阅读 11
收藏 0
点赞 0
评论 0

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,当然也可以自己定义新的Bundlefinish();//此处一定要调用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()方法好.

本文转载自:http://blog.sina.com.cn/s/blog_9151846a0102vrwj.html

共有 人打赏支持
Carbenson
粉丝 13
博文 224
码字总数 69838
作品 0
广州
程序员
startActivityForResult用法

startActivityForResult与startActivity的不同之处在于: · startActivity( ):仅仅是跳转到目标页面,若是想跳回当前页面,则必须再次调用startActivity( )。 · startActivityForResult( ...

ord1nary ⋅ 2014/04/16 ⋅ 0

android学习笔记(六)

一、从Activity返回数据 1.在点击按钮时要发送请求码 startActivityForResult(intent, 0); 2.接收数据完成onActivityResult方法 @Override protected void onActivityResult(int requestCod......

Kaming ⋅ 2014/09/22 ⋅ 0

调用startActivityForResult后,onActivityResult立刻响应,返回当

调用startActivityForResult后,onActivityResult立刻响应,返回当前页,有需要的朋友可以参考下。 这个问题浪费了我很多时间,参考了网上的一些博客,找到了原因,在此感谢那些分享知识的好...

丁佳辉 ⋅ 2015/11/18 ⋅ 0

Activity数据传递详解

唉,好久都没有写过博客了。真的是太懒了。最近在看《Android权威编程指南》,挺不错的一本书,感觉里面有很多开发规范,是很值得一看的一本书。 感觉在工作中经常处理Activity之间的数据传递...

一本未写完的书 ⋅ 2017/11/12 ⋅ 0

Android使用Intent调用摄像头并获取照片

使用Android的Intent调用另外一个activity的时候,采用的是多线程机制,异步方式。startActivityForResult之后被调用activity并没有马上返回结果给调用activity,Android的Acitivity对象中s...

huist ⋅ 2015/11/13 ⋅ 0

Android activity 传递大数据 如bitmap,怎么实现啊,我的老是报错

a activity 中部分代码: Bitmap bmp = ((BitmapDrawable) headerImage.getDrawable()).getBitmap();Intent intent = new Intent(MainActivity.this, BigHeaderImage.class);ByteArrayOutput......

菜鸟刘 ⋅ 2016/05/21 ⋅ 2

Android startActivity()和onActivityResult()使用总结

有三个Activity: A.java ,B.java ,C.java Activity之间的跳转常用方法: 1. startActivity(Intent intent); 该方法只用于启动新的Activity 2.startActivityForResult(Intent intent, int re......

mengyrlind ⋅ 2014/09/10 ⋅ 0

android--startActivity(intent)分析源码

这篇文章主要解释一下startActivity(intent)方法,基于android的源码。大家都很熟悉这么这2行代码: Intent intent = new Intent(v.getContext(),ManagePhoneidActivity.class);startActivi...

cookqq ⋅ 2012/11/12 ⋅ 0

调用startActivityForResult后,onActivityResult立刻响应

调用startActivityForResult后,onActivityResult立刻响应,返回当前页,有需要的朋友可以参考下。 这个问题浪费了我很多时间,参考了网上的一些博客,找到了原因,在此感谢那些分享知识的好...

tyronejw ⋅ 2016/01/06 ⋅ 0

【android基础】Android Intent 用法全面总结

[代码] 调用拨号程序 // 给移动客服10086拨打电话 Uri uri = Uri.parse("tel:10086"); Intent intent = new Intent(Intent.ACTION_DIAL, uri); startActivity(intent); [代码] 发送短信或彩信......

挨踢人生 ⋅ 2012/04/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部