Android的onActivityResult提前调用了

8

我有两个活动,分别在不同的应用程序中。Activity1 上有一个按钮,用户可以点击它,在其 onClick() 方法中使用意图调用第二个活动:

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

这段代码可以在Activity1中正确地启动Activity2,但是onActivityResult方法会在Activity2的onCreate方法之前就被调用了,而不是在我设置返回intent的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等),如这里建议的那样,并且我的请求代码不是负数,如这里所警告的。我也尝试了android:launchMode="singleTop",但也不行。
我还尝试按照这里提到的方法,在Activity2中不调用onBackPressed()中的finish()(也只是像这里建议的那样只使用super.onBackPressed()),然后再像这里建议的那样调用它。
此外,我尝试注释掉intent.putExtra("Stuff", someStuff);这一行,因为它似乎给这个人带来了麻烦。
有什么想法吗?
3个回答

10

这里是最终解决方案:

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

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

由于某些原因,Android要求除第一个参数给出的包名外,还需要提供第二个参数的完全限定名称。现在它可以工作了!:)


1
非常感谢您回来并发布您的解决方案。我一直被这个问题困扰了很长时间,我也尝试了您在问题中提到的所有解决方案,但都没有成功。这个解决方案解决了我的问题,让我的一天变得更好了 =) - Kristen D.
我在我的所有项目中都使用startActivityForResult而没有设置setClassName或完全限定名称,它们都可以完美地工作,除了一个例外。所以我在那种情况下尝试了你的解决方案,但并没有什么不同。 - user316117
非常感谢您提供的解决方案,2小时!! - Anthone
遗憾的是,这并没有解决我的问题,其他答案也没有! - Muhammad Alfaifi
1
这对我也解决了问题,特别是在两个独立应用程序之间通信的情况下。 - syonip

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

感谢jbaylina的回答,对我很有帮助。 - Swapnil

0

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

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

Activity2的onCreate()代码在哪里?onBackPressed()的代码在哪里?你能证明在Activity2中调用了setResult()之前的某些其他代码吗?你应该在调试中运行这些活动。确保Activity2正在接收你认为它应该接收的意图,然后逐步跟踪执行的语句,直到setResult()。不要在理解基本问题之前向代码提供解决方案。

就目前而言,我所知道的是,Activity1正在发送一个Intent,然后调用了onActivityResult。到目前为止没有证明其他任何事情。


谢谢您的评论 - 我已经在问题中添加了 onCreateonBackPressed 方法。我多次以调试模式运行它,并使用断点成功展示了当 Activity2 被首次启动时会调用 Activity1 的 onActivityResult 方法,而在 Activity2 返回之后不会再次调用。 - user1205577
我也尝试使用Intent(context, Activity2.class)创建一个意图,但是它抱怨找不到该类(可能是因为它在另一个应用程序中)。我尝试了几种使用完全限定路径名称的变化,但也不行。 - user1205577

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接