Activity的startActivityForResult

作为Android开发人员,众所周知,启动Activity有两个方法,一个是startActivity,另一个则是startActivityForResult。

startActivity(Intent intent):直接启动Activity,只需要传一个Intent类型的参数即可。

startActivityForResult(Intent intent, int requestCode):需要两个参数,Intent和Int类型参数,使用该方法启动Activity,当返回该Activity时,系统会自动调用Activity的onActivityResult方法进行回调,那么startActivityForResult有什么作用呢?

startActivityForResult的作用(使用场景):Activity A需要在B中执行一些数据操作,而B又将执行结果返回给A。当我们关闭Activity B的时候,系统会自动调用A的onActivityResult方法。

    @Override
    protected void onActivityResult(
            int requestCode, 
            int resultCode, 
            Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

    }
复制代码

该方法有三个参数requestCode,resultCode和data:

data:Activity B关闭时候,通过调用setResult 方法,传送给A的Intent数据。

resultCode:当前Activity返回原来Activity’的返回码,通常为RESULT_CANCELED或RESULT_OK,也可以自己设定,通过返回码可以判断当前返回的数据是来源于那个Activity,然后做相应的业务处理。

requestCode:请求码,根据业务需要自己设定,用于标识请求来源,如有三个Activity A、B、C, A和B都调用startActivityForResult启动C,当C关闭后,系统都会调用A和B的onActivityResult方法,这时就可以使用请求码来判断是那个Activity打开C的,然后做相应的业务处理。

从上面的分析中,我们注意到在Activity B关闭的时候需要调用setResult 方法才能够将data和resultCode返回到A中的onActivityResult方法。那么我们在B中何时执行该方法呢?执行该方法有何要求呢?

我们先看下Activity的finish方法:

private void finish(int finishTask) {
        if (mParent == null) {
            int resultCode;
            Intent resultData;
            synchronized (this) {
                resultCode = mResultCode;
                resultData = mResultData;
            }
            if (false) Log.v(TAG, "Finishing self: token=" + mToken);
            try {
                if (resultData != null) {
                    resultData.prepareToLeaveProcess(this);
                }
                if (ActivityManager.getService()
                        .finishActivity(mToken, resultCode, resultData, finishTask)) {
                    mFinished = true;
                }
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishFromChild(this);
        }
    }
复制代码

从源码中可以知道:setResult 方法必须要在执行finish方法之前执行,否则无效,也就是resultCode会返回默认值RESULT_CANCELED,而resultData会返回null。因为返回resultCode和resultData是在finishActivity的时候,所以setResult不可以位于Activity的finish方法之后。

下面我们实践一个例子: MainActivity


public class MainActivity extends AppCompatActivity {

    private static final int A_REQUEST = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.findViewById(R.id.button01).setOnClickListener(mOnClickListener);

    }
    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.button01:
                    Intent intent = new Intent(MainActivity.this,ResultActivity.class);
                    startActivityForResult(intent,A_REQUEST);
                    break;
                default:
                    break;

            }
        }
    };

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        String a = data.getStringExtra("a");
        if (requestCode == A_REQUEST && resultCode == 1){
            Log.i("test",a);
        }

    }
}

复制代码

使用startActivityForResult方法启动,并且传入一个请求码,在onActivityResult回调方法中使用返回码和请求码进行判断,然后获取返回的数据,并打印出来。

ResultActivity:

public class ResultActivity extends AppCompatActivity {
    private static final int RESULT = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        Intent mIntent = new Intent();
        mIntent.putExtra("a","我是ResultActivity");
        // 设置结果,并进行传送
        this.setResult(RESULT, mIntent);
        finish();
    }
}
复制代码

RESULT:返回码 mIntent:返回的数据。

上图显示,在MainActivity中,确实已经拿到了返回的数据,并打印出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值