【问题标题】:Every time onActivityResult returning data as null in multi chain activity每次 onActivityResult 在多链活动中返回数据为空
【发布时间】:2018-01-12 17:43:40
【问题描述】:

首先,相关问题的每个答案都没有解决我的问题,这就是我创建一个新问题的原因。

我有两个应用程序。从第一个应用程序开始,我使用带有 onActivityResult 的 URI 调用 ACTION_VIEW 的意图。

在第二个应用程序中,我为同一个 URI 设置了一个意图过滤器。

现在从 Activity B,我在 App2 中使用 onActivityResult 调用 Activity C。

在活动 C 中,我使用 onActivityResult 调用活动 D。

在活动 D 中进行一些工作后,将在捆绑包中设置包含一些数据的结果并将结果设置为 OK。

我没有在 Activity C 中获取这些数据,而是在 Activity B 中获取意图,并且捆绑中的数据为 null。

而 Activity B 正在向 App1 的 Activity A 发送相同的响应。因此,我在 App1 中也得到了空数据。

在请求中,

App1 (Activity A) ---> App2 (Activity B) ---> Activity C ---> Activity D

作为回应,

Expected : App1 (Activity A) <--- App2 (Activity B) <--- Activity C <--- Activity D

Actual : App1 (Activity A) <--- App2 (Activity B) <--- Activity D
with data as null.

请帮助我从 App2 的 Activity D 获取数据到 App1 的 Activity A。

代码:

App1 活动 A:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(deepLinkUrl));
Intent chooser = Intent.createChooser(intent, title);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(chooser, 1);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        if (data.getExtras() != null) {
            Log.e("onActivityResult", "responseIntent.getExtras() " + 
                     data.getExtras());
        }
    }
}

App2 活动 B:

Constants.deeplinkUri = getIntent().getData();
Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
intent.setData(Uri.parse(Constants.deeplinkUri));
startActivityForResult(intent, 100);

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 100) {
        if (data.getExtras() != null) {
            Log.e("onActivityResult", "responseIntent.getExtras() " + 
                     data.getExtras());
        }
        setResult(Activity.RESULT_OK, data);
        finish();
    }
}

App2 活动 C:

Intent intent = new Intent(LoginActivity.this, PayActivity.class);
intent.setData(Uri.parse(Constants.deeplinkUri));
startActivityForResult(intent, 100);

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 100) {
        if (data.getExtras() != null) {
            Log.e("onActivityResult", "responseIntent.getExtras() " + 
                     data.getExtras());
        }
        setResult(Activity.RESULT_OK, data);
        finish();
    }
}

App2 活动 D:

Intent returnIntent = new Intent();
returnIntent.putExtra("result", msg);
setResult(Activity.RESULT_OK, returnIntent);
finish();

提前致谢。 有人吗?

【问题讨论】:

  • 如果您仍需要帮助,请考虑发布MCVE。我只是设置了两个应用程序来重现您的情况,尽可能多地使用您的代码,并且一切正常(所以如果所有请求代码都相同,则没有问题)
  • 你能分享这个项目,以便我可以和我的项目进行比较。
  • 基本上和this one一样。我只是没有将FLAG_ACTIVITY_FORWARD_RESULT 和startActivity() 与Intent 一起用于(B -> C)和(C -> D),而是复制了您的代码。 (另外,我编写了一个小应用程序来触发我的 Activity A 并在 Activity A 中使用 onActivityResult() 将所有内容传递回另一个应用程序)顺便说一句,如果您正在寻找“从 App2 的 Activity D 获取数据到 App1 的 Activity A” ,我的回答中的方法甚至可能更适合您的用例,因为它在返回的路上会跳过活动 C 和 B。

标签: android android-intent android-activity intentfilter


【解决方案1】:

您在拨打startActivityForResult 时遇到问题。

从您的ActivityA,您将像这样启动ActivityB。

startActivityForResult(chooser, 1); // The request code is 1

通过您的ActivityB,您将使用此启动ActivityC。

startActivityForResult(intent, 100); // Request code 100

从ActivityC 启动ActivityD,请求代码相同,即 100。

startActivityForResult(intent, 100);  // Same request code 100

因此,当您的 ActivityD 设置一些结果并将结果意图传递给调用 Activity 时,它会立即将带有 super 调用的结果传递给其父级。在您的情况下,它立即将结果传递给ActivityB,并且ActivityB 中有一个处理程序来处理请求代码100,它也获得了空值。

因此,您可以尝试在此处为每个Activity 设置不同的请求代码以避免这种情况。

像这样从您的ActivityB 启动ActivityC。

startActivityForResult(intent, 100);  // Request code 100

然后像这样从ActivityC 启动ActivityD

startActivityForResult(intent, 101);  // Request code 101

现在在ActivityC 中添加处理程序以在ActivityC 中使用请求代码101 处理结果。

希望这能解决您的问题。

【讨论】:

  • 抱歉无法正常工作 :( 在 ActivityB 中仍然得到相同的空响应
  • 应该的。现在我对这里出了什么问题感到困惑。您在函数 onActivityResult 上有注释 @Override 对吗?
  • 在每项活动中都是这样
  • 很高兴知道这有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多