【问题标题】:startActivityForResult() not working for external ActivitystartActivityForResult() 不适用于外部活动
【发布时间】:2015-08-24 17:51:38
【问题描述】:

这不是一个重复的问题。我只发现this 问题相关,但没有任何可行的解决方案。

我有什么

我有两个由我创建的应用程序,应用程序 A 和应用程序 B。我的要求是通过单击按钮从应用程序 A 打开应用程序 B。现在App B会做一些处理,返回一个小状态给App A,应该可以吧?

我做了什么

Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage(Config._PACKAGE);
getActivity().startActivityForResult(intent, 6699);

这会完美地打开 App B。现在在 App B 中,

 Intent returnIntent = new Intent();
 returnIntent.putExtra("STATUS", statusCode);
 setResult(RESULT_OK, returnIntent);
 finish();

这是我在 Activity 上的 onActivityResult() 方法。不过,我是从 Fragment 开始 Activity。

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

        Log.d(TAG, "ON ACTIVITY RESULT");

        if (requestCode == 6699) {

            if (resultCode == RESULT_OK) {

                Log.d(TAG, "RESULT OK");

            }
            if (resultCode == RESULT_CANCELED) {

                Log.d(TAG, "RESULT NOT OK");

            }
        }
    }

问题

当我使用RESULT_CANCELLED. 启动App B 的活动时,onActivityResult() 被调用,这怎么可能?是因为它是一项新任务吗?

但是当我在 App B 上调用 finish() 并且它关闭并将我带回 App A 时,但这次没有调用 onActivityResult()?我该如何解决这个问题?

这是一个非常基本的要求,应该有解决方案。

【问题讨论】:

  • 来自the docs:“如果您正在启动的活动使用singleTask启动模式,它将不会在您的任务中运行,因此您将立即收到取消结果”
  • 应用 B 中的 Activity 在其 manifest 中没有提到 launchMode。那有什么问题呢?

标签: android android-intent android-activity


【解决方案1】:

我终于解决了这个问题。

如果您正在启动的活动使用 singleTask 启动模式,它 不会在您的任务中运行,因此您将立即收到 取消结果

这就是文档所说的。现在的想法是,如果调用的活动在新任务上启动,结果将立即取消。就我而言,我完全从不同的应用程序开始一个活动,它总是在一个新任务中开始,不管任何launchModetaskAffinity 或标志。

每当我做这样的事情时,

Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage(Config._PACKAGE);
getActivity().startActivityForResult(intent, 6699);

默认情况下会自动添加此标志Intent.FLAG_ACTIVITY_NEW_TASK。因此,我们需要在开始使用 Activity 之前清除所有标志,

intent.setFlags(0);

在调用startActivity() 之前使用它。解决方案既简单又棘手。

【讨论】:

    【解决方案2】:

    您确实应该添加一个自定义 Intent 过滤器来实现这一点。这将允许您为您希望应用程序 B 执行的任务引导流程,与您可能如何使用应用程序 B 分开。请参阅Android docs Intent Filter 了解如何执行此操作。基本上,您在应用程序 B 的清单中添加一个简介,如下所示:

    <activity android:name="ShareActivity">
        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="text/plain"/>
        </intent-filter>
    </activity>
    

    应用程序 A 将使用如下内容:

    Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
    sendIntent.setType("text/plain");
    
    // Verify that the intent will resolve to an activity
    if (sendIntent.resolveActivity(getPackageManager()) != null) {
        startActivity(sendIntent);
    }
    

    这些当然需要为您的应用程序定制。

    【讨论】:

    • 谢谢。你能提供一个应该如何做的例子吗?我已经在我的问题中发布了我所做的所有事情。
    • 我应该使用 startActivity() 而不是 startActivityForResult()?
    • 是的,startActivityForResults 是获取信息的正确方式。
    • 如何解决 onActivityResult() 没有被调用的问题?
    • AFAICT,它没有。 @PearsonArtPhoto,你想解释一下这是如何回答这个问题的吗?
    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多