【问题标题】:Why does onActivityResult() gets called when the person who is calling it is null?当调用它的人为空时,为什么会调用 onActivityResult()?
【发布时间】:2016-08-25 05:36:16
【问题描述】:

我花费大量时间试图弄清楚每次您在活动中使用startActivityForResult() 并期待结果时如何调用onActivityResult() 方法。所以我四处寻找,我能够找到称为onActivityResult() 的方法。 但是,让我感到困惑的是 who 变量必须为 null 才能调用 onActivityResult()。我认为who 变量代表返回结果的活动或调用结果的活动。现在,如果who = null 那么为什么要调用 onActivityResult() ,因为没有人需要交付结果,也不存在任何生成结果的活动。那么谁能向我解释为什么who = null

来源

6185    public void dispatchActivityResult(String who, int requestCode,
6186        int resultCode, Intent data) {
6187        if (false) Log.v(
6188            TAG, "Dispatching result: who=" + who + ", reqCode=" + requestCode
6189            + ", resCode=" + resultCode + ", data=" + data);
6190        mFragments.noteStateNotSaved();
6191        if (who == null) {
6192            onActivityResult(requestCode, resultCode, data);
6193        } else {
6194            Fragment frag = mFragments.findFragmentByWho(who);
6195            if (frag != null) {
6196                frag.onActivityResult(requestCode, resultCode, data);
6197            }
6198        }
6199    }

证明谁代表调用 startActivityForResult() 的活动。

方法startActivityForResult():

    public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
3744        if (mParent == null) {
3745            Instrumentation.ActivityResult ar =
3746                mInstrumentation.execStartActivity(
3747                    this, mMainThread.getApplicationThread(), mToken, this,
3748                    intent, requestCode, options);
3749            if (ar != null) {
3750                mMainThread.sendActivityResult(
3751                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
3752                    ar.getResultData());
3753            }

您可以看到 execStartActivity 有 this,这是作为 who 传递给它的当前活动。

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

【问题讨论】:

    标签: java android


    【解决方案1】:

    代码中的答案是正确的:如果who 不为空,则将结果传递给Fragment 而不是Activity

    【讨论】:

    • 等等,我还是不明白。如果它代表一个要求交付结果的活动,为什么 who 必须为空?如果是这种情况,那么每当一个活动要求传递一个结果时,即使活动正在调用它,它也会直接转到一个片段,这并不好。
    • who 不代表创建结果的活动。它代表一个名为startActivityForResult 的片段,因此希望接收结果。
    • 哦,所以当您调用 startActivityForResult() 时让我直截了当地说,在您的活动的 onResume() 方法中,它成为请求结果的片段?这是如何运作的?另外,我检查了源代码,除了上面列出的方法之外,没有其他方法调用 onActivityResult()。
    • 如果调用者是一个片段,它被设置为who。如果它不是一个片段(因此不是一个活动),who 就是null
    • 谁实际上不为null,因为如果你去看看startActivityForResult(),有这行代码` Instrumentation.ActivityResult ar = 3746 mInstrumentation.execStartActivity( 3747 this, mMainThread.getApplicationThread (), mToken, this, 3748 intent, requestCode, options);` 代码行需要this,这是当前活动,this代表谁。抱歉,我不太确定如何布局什么是代码,所以请原谅我让它看起来很糟糕
    猜你喜欢
    • 2022-10-18
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多