【问题标题】:startActivityForResult crashes while startActivity worksstartActivityForResult 在 startActivity 工作时崩溃
【发布时间】:2019-01-13 19:10:09
【问题描述】:

我正在开始一项活动:

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 模拟器)

【问题讨论】:

  • 尝试一个四位数的int 值。
  • @Barns 认真的???有效。但为什么?您可以将其发布为答案吗?
  • 不知道。我过去遇到过问题,当我将 intvalue 更改为更小的值(如四位数)时,它起作用了。我还没有检查我可以使用哪个最大 int 值。

标签: android android-activity start-activity startactivityforresult


【解决方案1】:

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

void startActivityForResult (Intent intent, int requestCode)

修改标准行为以允许将结果传递到片段。这施加了限制 该 requestCode 为

source code of FragmentActivity 中可以找到以下有用的评论:

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

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

【讨论】:

  • 好找到迈达斯!那被埋得很深。
  • 现在说得通了。如果它抛出一个指示问题的异常而不是一般的非法状态异常,那就更好了。
  • 欢迎使用 Android ;)
【解决方案2】:

如果没有看到有关此问题的任何文档,但尝试使用四位数字 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

【讨论】:

  • 很奇怪。如果方法签名使用short 而不是int,那会更有意义。
  • 发现 this link 表示请求代码限制为 0xffff (65535)。不知道他们是怎么知道的……
猜你喜欢
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
相关资源
最近更新 更多