【问题标题】:Android onActivityResult called earlyAndroid onActivityResult 提前调用
【发布时间】:2012-04-06 20:21:25
【问题描述】:

我有 2 个活动,每个活动都在单独的应用程序中。 Activity1 有一个用户可以单击的按钮,它使用其onClick() 方法中的意图调用第二个活动:

Intent myIntent = getPackageManager().getLaunchIntentForPackage(com.myProject.Activity2);
startActivityForResult(myIntent, 600);

这会正确地从 Activity1 启动 Activity2,但 onActivityResult 在 Activity2 中调用 onCreate 之前在 Activity1 中被调用,而不是在我设置返回意图的 onBackPressed() 中。

这里是 Activity2 的onCreate 方法:

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

这是 Activity2 的 onBackPressed 方法的当前版本:

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("Stuff", someStuff);

    if(getParent()==null){
        setResult(Activity.RESULT_OK, intent);
    }else{
        getParent().setResult(Activity.RESULT_OK, intent);
    }
    finish();
    super.onBackPressed();
}

我的 AndroidManifest.xml 有以下 Activity2 的意图过滤器:

<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

我验证了我的launchModestandard(而不是singleTask 等),正如here 所建议的那样,并且我的请求代码并不像here 所警告的那样为负。我也试过android:launchMode="singleTop",但那也是不行的。

我还尝试在onBackPressed() 中不为 Activity2 调用finish(),如提到的here (也只使用super.onBackPressed(),如建议的here)并再次按照建议的here 调用它。

此外,我尝试将 intent.putExtra("Stuff", someStuff); 行注释掉,因为它似乎会给 this person 带来麻烦。

关于我可能做错了什么有什么想法吗?

【问题讨论】:

    标签: android android-intent android-activity


    【解决方案1】:

    所以这是解决它的最终解决方案:

    我将 Activity1 的意图更改为以下内容:

    Intent myIntent = new Intent();
    myIntent.setClassName("com.myProject", "com.myProject.Activity2");
    startActivityForResult(myIntent, 600);
    

    由于某种原因,除了第一个参数给出的包名称之外,Android 还需要第二个参数的完全限定名称。现在它起作用了! :)

    【讨论】:

    • 非常感谢您回来并发布您的解决方案。我被这个问题困扰了很长时间,我也尝试了您在问题中遇到的所有解决方案,但无济于事。这解决了它,让我的一天变得更好了 =)
    • 我在我的项目中使用 startActivityForResult 没有 setClassName 或完全限定的名称,除了一种情况外,它们都可以正常工作。所以我在这种情况下尝试了你的解决方案,但没有任何区别。
    • 2 小时!!非常感谢您的解决方案
    • 遗憾的是,这并没有解决我的问题,其他答案也没有!
    • 这也为我解决了这个问题,在两个独立应用程序之间进行通信的特定情况下。
    【解决方案2】:

    如果在启动活动时设置了“singleInstance”标志,就会发生这种情况。

    【讨论】:

    • 谢谢 jbaylina 你的回答对我很有帮助
    【解决方案3】:

    不确定您的问题是什么。您在 Activity1 中创建 Intent 的方式很奇怪;该方法不适用于创建在同一应用程序中启动另一个活动的意图。一些开发人员使用 Intent(Context, Class) 构造函数。我更喜欢将 Intent(String action) 与仅在我的应用程序中定义的自定义操作字符串一起使用(这样更容易正确编码)。

    此外,您为 Activity2 指定的意图过滤器通常用于直接从主屏幕启动的 Activity。

    activity2 的 onCreate() 代码在哪里? onBackPressed() 的代码在哪里?你能向我证明 setResult() 是在 Activity2 中的其他代码之前调用的吗?您应该在调试中运行活动。确保 Activity2 正在接收您认为它应该接收的意图,然后逐步跟踪执行的语句,直到 setResult()。 要做的事情是在您了解根本问题是什么之前在代码中抛出解决方案。

    据我所知,Activity1 正在发送一个 Intent,然后调用 onActivityResult。到目前为止,还没有其他任何证据。

    【讨论】:

    • 感谢您的评论 - 我已将 onCreateonBackPressed 方法添加到问题中。我多次运行它调试并使用断点,我能够证明 Activity1 的 onActivityResult 在 Activity2 首次启动时被调用 - 在 Activity2 返回之前,并且在它返回时不会再次被调用。
    • 我也尝试使用Intent(context, Activity2.class) 创建一个意图,但它抱怨找不到类(可能是因为它在另一个应用程序中)。我尝试了一些使用完全限定路径名的变体,这也是不行的。
    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    相关资源
    最近更新 更多