文档章节

startActivityForResult与startActivity的不同之处

Carbenson
 Carbenson
发布于 2015/06/17 23:32
字数 739
阅读 12
收藏 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
粉丝 15
博文 240
码字总数 75403
作品 0
广州
程序员
私信 提问
startActivityForResult用法

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

ord1nary
2014/04/16
0
0
调用startActivityForResult后,onActivityResult立刻响应,返回当

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

丁佳辉
2015/11/18
0
0
android开发之Intent.Action

本文介绍Android中Intent的各种常见作用。 1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始。比较常用。 Input:nothing Output:nothing <activity a......

一别经年
2014/01/21
0
0
Android开发之Intent.Action

介绍Android中Intent的各种常见作用。 1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始。比较常用。 Input:nothing Output:nothing <activity andro......

xiahuawuyu
2012/09/24
0
0
Android activity 传递大数据 如bitmap,怎么实现啊,我的老是报错

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

菜鸟刘
2016/05/21
615
2

没有更多内容

加载失败,请刷新页面

加载更多

windows上类似dnsmasq的软件Dual DHCP DNS Server

官网地址:http://dhcp-dns-server.sourceforge.net/官网定向的下载地址:https://sourceforge.net/projects/dhcp-dns-server/files/ 设置参考地址:http://blog.51cto.com/zhukeqiang/18264......

xueyuse0012
今天
3
0
LinkedHashMap源码解析

前言 HashMap中的元素时无序的,也就是说遍历HashMap的时候,顺序和放入的顺序是不一样的。 如果需要有序的Map,就可以采用LinkedHashMap. LinkedHashMap通过维护一个包含所有元素的双向链表,...

grace_233
今天
3
0
初识flask

文档 0.10.1版本 http://www.pythondoc.com/flask/index.html 1.0.2版本 https://dormousehole.readthedocs.io/en/latest/ 安装flask $ pip3 install flaskCollecting flask Downloading......

yimingkeji
昨天
5
0
Akka系统《sixteen》译

Actor是一个封装状态(state)和行为(behavior)的对象,它们只通过交换消息通信(放入收件人邮箱的邮件)。从某种意义上说,Actor是最严格的面向对象编程形式,但它更适合将他们视为人:在与Act...

woshixin
昨天
3
0
技术工坊|如何开发一款以太坊钱包(深圳)

【好消息!】HiBlock区块链技术工坊已经成功举办了26期,其中北京1期,西安1期,成都2期,上海22期。经常有社区的小伙伴问定期举办技术工坊的除了上海以外,其他城市有没有?现在区块链技术工...

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部