gpt4 book ai didi

android - 为什么 onActivityResult() 只在 requestCode>=0 时调用?

转载 作者:行者123 更新时间:2023-11-29 23:16:19 25 4
gpt4 key购买 nike

我们可以知道,startActivity方法会调用startActivityForResult方法;还有一些代码如下:

    /**
* Same as calling {@link #startActivityForResult(Intent, int, Bundle)}
* with no options.
*
* @param intent The intent to start.
* @param requestCode If >= 0, this code will be returned in
* onActivityResult() when the activity exits.
*
* @throws android.content.ActivityNotFoundException
*
* @see #startActivity
*/
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
startActivityForResult(intent, requestCode, null);
}

我尽力找到处理requestCode的源代码。但我什么也没找到。有人可以复制源代码并告诉我当只调用 requestCode>=0 时如何处理 OnActivityResult() 吗?

最佳答案

如您包含的代码 fragment 所示,startActivityForResult 的双参数版本调用 startActivityForResult 的三参数版本.三参数版looks like this :

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {
//...
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(),
ar.getResultData());
}
if (requestCode >= 0) {
// If this start is requesting a result, we can avoid making
// the activity visible until the result is received. Setting
// this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
// activity hidden during this time, to avoid flickering.
// This can only be done when a result is requested because
// that guarantees we will get information back when the
// activity is finished, no matter what happens to it.
mStartedActivity = true;
}

//...
} else {
//...
}
}

评论在if (requestCode >= 0) {} block 描述了当请求代码为 >= 0 时行为如何变化。对比< 0 .

如果我们看the source code for mInstrumentation.execStartActivity ,我们发现以下内容:

public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {

//...

if (am.isBlocking()) {
return requestCode >= 0 ? am.getResult() : null;
}

// ...
}

return requestCode >= 0 ? am.getResult() : null;返回 null ActivityResult如果requestCode是负的。跳回到 startActivityForResult在此答案顶部的代码,我们看到 mMainThread.sendActivityResult当且仅当 ActivityResult 被调用由 execStartActivity 返回是非 null .是sendActivityResult最终导致调用 onActivityResult .所以这里的逻辑路径是:

startActivityForResult被称为负数 requestCode
mInstrumentation.execStartActivity被称为负数 requestCode
mInstrumentation.execStartActivity返回 null
mMainThread.sendActivityResult未被调用
onActivityResult不叫

关于android - 为什么 onActivityResult() 只在 requestCode>=0 时调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55298890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com