startActivityForResult和setResult详解

startActivityForResult与startActivity的不一样之处在于
一、startActivity( ) 
仅仅是跳转到目标页面,如果想跳回当前页面,则必须再使用一次startActivity( )。
二、startActivityForResult( ) 
能够一次性完成这项任务,当程序执行到这段代码的时候,倘若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法之后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。html

 

相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)java

 

简单例子介绍:android

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

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方法。
this

setResult(RESULT_OK, intent); //intent为A传来的带有Bundle的intent,固然也能够本身定义新的Bundlefinish();//此处必定要调用finish()方法

Android activity的setResult()在何时调用(重点也是难点)spa

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

若是一个activity要返回数据到启动它的那个activity,能够调用setResult()方法。那何时去调用setResult()方法返回数据呢?
看一下源码就明白了:htm

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以前的blog

按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://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html

相关文章
相关标签/搜索