请有人解释一下RESULT_FIRST_USER是什么意思。

40

除了我的结果代码必须大于1之外,我不理解RESULT_FIRST_USER的意义、价值或重要性。有人可以解释一下吗?对讲英语的人来说,RESULT_OK和RESULT_CANCELED是很容易理解的。但在Android世界中,RESULT_FIRST_USER是什么意思呢?所有的文档都只是这么说:

Start of user-defined activity results.
4个回答

34

实际上,这个问题的答案是来自于@CommonsWare和@Chris的评论的结合。因此,为了后代的利益,我将整合这些评论,让它们在一个地方可用。

基本上,有两个预定义的常量用于requestCode,它们是Activity.RESULT_OKActivity.RESULT_CANCELLED。然而,安卓开发者也可以通过使用偏移量Activity.RESULT_FIRST_USER来设置他们应用程序的自定义代码。这样做确保了操作系统级别和应用程序级别设置常量之间没有冲突。

纯属我的意见,我认为FIRST USER后缀意味着指的是开发者——就像最终消费者指的是所述产品的消费者一样——他们是应用程序用户之前的第一批用户。

以下是如何使用这个偏移量的示例:

public static final int MY_RESULT_CODE = Activity.RESULT_FIRST_USER + 1;

1
这真的应该是被接受的答案,因为它实际上回答了问题。代码示例使其更清晰。 - Benjamin
将requestCode与resultCode更新。 - jacorl

14

当一个活动结束时,它可以调用setResult(int)来将数据返回给它的父级。

必须始终提供结果代码,可以是标准结果:

  • RESULT_CANCELED(标准活动结果:操作已取消。常量值:0)
  • RESULT_OK(标准活动结果:操作成功。常量值:-1),或任何自定义值,以RESULT_FIRST_USER开头(用户定义的活动结果开始。常量值:1)。此外,它还可以可选地返回包含其想要的任何其他数据的Intent。

因此,由于您必须提供结果代码,Android会“帮助”您一些,告诉您:请声明此Activity的结果代码是OKCANCELED还是您自己制定的自定义结果。


2

活动结果是一个32位整数。可能的值分为三个范围:

  • -2及以下:未使用。
  • -1和0:系统定义的值。即由Android定义的活动结果。
  • 1及以上:用户定义的值。即应用程序开发人员定义的活动结果。

RESULT_FIRST_USER 标识用户定义范围中的第一个值。以下示例定义显示系统和用户定义值如何组合在一起:

public static final int RESULT_OK = -1; // Defined by Android. You don't write this code.
public static final int RESULT_CANCELED = 0; // Defined by Android. You don't write this code.
public static final int RESULT_ENDED_GAME = RESULT_FIRST_USER + 0; // Defined by an app.
public static final int RESULT_ACTIVATED_RADAR = RESULT_FIRST_USER + 1; // Defined by an app.
public static final int RESULT_LAUNCHED_ROCKETS = RESULT_FIRST_USER + 2; // Defined by an app.

2
当您完成一个活动时,您可以调用setResult(RESULT_CODE)将数据发送回另一个活动。如果您不调用此方法,则默认值将是RESULT_CANCELLED(等于0)。
返回数据的示例:
Intent intent= new Intent();
intent.putExtra("data",data);
setResult(YOUR_RESULT_CODE,intent);
finish();

5
那他们为什么不直接称其为空结果(RESULT_EMPTY)或类似的名称呢?为什么要用FIRST_USER这样的名字?这个名字让人感觉故事还有更多内容。FIRST_USER在安卓生态系统或软件工程中有特殊含义吗?当然,我感谢你的回复。但这个名字很可疑,你不觉得吗? - Katedral Pillon
1
我猜他们添加了它,这样你就知道何时开始使用自定义值,因为 RESULT_OK 是 -1,而 RESULT_CANCELED 是 0。 - Andrew Brooke
56
@KatedralPillon:为什么是“FIRST_USER”?这是在处理整数返回代码时的一个相当普遍的约定,特别是在多个参与方(例如库作者和应用程序作者)可能想要定义这些代码的情况下。我记得在20到25年前的C/C++中经常使用这种方法。基本上,任何小于“RESULT_FIRST_USER”的值都保留给框架使用,以“RESULT_FIRST_USER”开头的任何值都可以供应用程序使用,而不会发生碰撞。在Android中,至少在Java层面上并不经常看到这种方法。 - CommonsWare
1
如果您在不调用setResult的情况下完成一个活动,会收到RESULT_CANCELED吗? - Cheok Yan Cheng
8
RESULT_FIRST_USER 应该被您的应用程序用于开始定义代码,例如: class MyActivity extends Activity { public static final int RESULT_THING1_FAILED = RESULT_FIRST_USER + 1; public static final int RESULT_THING2_FAILED = RESULT_FIRST_USER + 2; ... }这样,如果他们预留更多的代码,您的代码不会出现问题。 - Chris
显示剩余5条评论

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