美文网首页
关于startActivityForResult

关于startActivityForResult

作者: 空山Echo | 来源:发表于2019-05-08 13:15 被阅读0次

话题

1、startActivityForResult 的使用场景是什么?

如果想在Activity中得到新打开Activity 关闭后返回的数据
需要使用系统提供的startActivityForResult()方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。

2、onActivityResult 回调里面的 resultCode 和requestCode 含义是什么?
  • requestCode 请求码,即调用startActivityForResult()传递过去的值,请求码的值是根据业务需要由自已设定,用于标识请求来源。
  • resultCode 结果码,标识返回的来源
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String result = data.getExtras().getString("result");//得到新Activity 关闭后返回的数据
        Log.i(TAG, result);
    }
3、Activity A 启动 B 的时候,在 B 中何时该执行 setResult?setResult 可以位于 Activity 的finish 方法之后吗?

在finish方法之前调用
如果在startActivityForResult启动的Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理!

4、关于setResult和finish方法源码解析
public final void setResult(int resultCode, Intent data) {
    synchronized (this) {
        mResultCode = resultCode;
        mResultData = data;
    }
}
    /**
     * Finishes the current activity and specifies whether to remove the task associated with this
     * activity.
     */
    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);
        }

        // Activity was launched when user tapped a link in the Autofill Save UI - Save UI must
        // be restored now.
        if (mIntent != null && mIntent.hasExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN)) {
            getAutofillManager().onPendingSaveUi(AutofillManager.PENDING_UI_OPERATION_RESTORE,
                    mIntent.getIBinderExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN));
        }
    }

相关文章

网友评论

      本文标题:关于startActivityForResult

      本文链接:https://www.haomeiwen.com/subject/zbkyoqtx.html