5

我正在使用按钮处理程序的 startActivityForResult() 启动一个活动,并且我的 onActivityResult() 被立即调用,甚至在目标活动的 onCreate() 被击中之前。

public void onGraphNext (View target) {
    Intent i = new Intent(this, AddCommentActivity.class);
    startActivityForResult(i,6);    // 6 is arbitrary request code               
}    

. . .

protected void onActivityResult(int requestCode, int resultCode,
        Intent returnData) {
   if  ( (resultCode == RESULT_OK) && (requestCode == 6) ) {
   Bundle extras = returnData.getExtras();
   comment = extras.getString("comment");
     }
} 

返回的结果代码为 0,请求代码为 6。在 StackOverflow 的其他地方,我看到有人报告此问题,解决方案是不在清单中的 launchMode 使用 singeInstance。但我使用的是标准。. .

<activity android:name="AddCommentActivity"
          android:configChanges="orientation"
          android:screenOrientation="portrait"
          android:launchMode="standard"></activity>  

提前感谢您的任何见解!

编辑: 我做了一个简单的测试程序,当调用者(“启动器”) - 带有 onActivityResult 的活动 - 是一个单一实例并且被调用的活动(“启动者”)是标准时,我可以可靠地重现问题。IE,

<activity android:name="Launcher"
          android:screenOrientation="portrait"
          android:launchMode="singleInstance"></activity> 

<activity android:name="Launchee"
          android:screenOrientation="portrait"
          android:launchMode="standard"></activity>  

这对我来说是个问题,因为在真正的应用程序中,由于其他原因,被调用的必须是单个实例,但它希望有按钮来启动其他活动以请求用户输入。如果我不能使用 startActivityForResult 怎么办?

4

1 回答 1

15

startActivityForResult()如果正在启动的活动与启动它的活动不在同一任务中运行,则您无法使用。这意味着这两个活动都不能拥有launchMode="singleInstance". 如果您要求这 2 个活动在不同的任务中运行,那么您需要使用不同的机制。sorta-kinda的文档暗示了这一点:startActivityForResult()

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

您可以做的是简单地使用启动活动startActivity()并让被调用的活动调用startActivity()返回到您的活动,并根据需要发送回数据作为Intent它使用的额外内容。

但是,您可能会考虑是否真的需要这些特殊的启动模式。通常,它们仅在主屏幕更换和其他非常特殊的应用程序中是必需的。大多数使用singleInstancesingleTask启动模式的开发人员都在错误地使用它们。

于 2013-05-18T19:11:14.243 回答