startActivity工作时,startActivityForResult崩溃

时间:2018-08-06 19:08:00

标签: android android-activity start-activity startactivityforresult

我正在开始一项活动:

Intent intent = new Intent(this, CreateItemDetailsActivity.class);
if(storeId != null) {
    intent.putExtra(Identifiers.STORE_ID, storeId);
}
intent.putExtra(Identifiers.ITEM_NAME, name);
intent.putExtra(Identifiers.ITEM_DESCRIPTION, description);
startActivity(intent);

这可行,但是现在我需要将数据返回到原始活动,因此我将startActivity调用更改为:

startActivityForResult(intent, CREATE_ITEM_RESULT);

({CREATE_ITEM_RESULT只是我组成的一个随机整数63463657)

但是,我的应用程序崩溃时,没有调用两个onCreate方法(我已经实现并在两者中都设置了断点):

Uncaught exception in thread main: java.lang.IllegalStateException: Could not execute method for android:onClick
android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)

(该代码在按钮点击处理程序中调用,因此为onClick

我看到App crashes when calling startActivityForResult遇到了同样的问题,但是被接受的答案表明删除了我没有的一行recipe.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);

为什么startActivityForResult正常工作时我在startActivity上崩溃了?

(我的最低SDK级别为16,目标和编译SDK级别为27,并且我正在运行Android 8.1模拟器)

2 个答案:

答案 0 :(得分:4)

如果尚未找到有关此问题的任何文档,但是尝试使用四位数的int值应该可以消除该错误。

我已经阅读了startActivityForResult的Google文档,但没有找到关于最大int大小的任何参考。甚至代码文档也指出:

  

@param requestCode如果> = 0,则此代码将在   活动存在时的onActivityResult()

因此,没有提及最大int值。奇怪...


编辑

感谢@MidasLefko查找此信息:

  

RequestCodes最多只能为0xffff(65535)。所以你可能是   调用startActivityForResult(intent,REQUEST_CODE);和REQUEST_CODE   大于65535。

在此网站上:

https://code-examples.net/en/q/db5947

答案 1 :(得分:2)

在不支持的Activity class implementation of startActivityForResult中,对requestCode的最大int值没有限制,只要它是正数即可。但是,FragmentActivity(以及扩展名为AppCompatActivity)overrides this behavior(文档):

  

void startActivityForResult(意图,int requestCode)

     

修改标准行为,以允许将结果传递给片段。这施加了限制   该requestCode为<= 0xffff。

source code of FragmentActivity中,发现以下有用的评论:

  

下一个候选请求索引的提示。请求索引是整数   在0和2 ^ 16-1之间,它们被编码为   Fragment.startActivityForResult(...)调用的requestCode。这个   允许我们将onActivityResult(...)调度到适当的位置   分段。请求索引由allocateRequestIndex(...)分配。

java中的int是32位,FragmentActivity使用16位来确定将结果发送到哪个片段,其他16位可用于开发人员。