2016-06-28 73 views
1

我打算为我所有的startActivityForResult()代码使用生成的资源ID,以便我可以在基类中使用onActivityResult(),而不必担心派生类是否使用相同的代码。在Android中为startActivityForResult()生成16位唯一ID

不幸的是,代码似乎只限于16位,资源ID是32位。有没有办法生成唯一的16位ID?

回答

1

其实有。此外,您可以使用标准ID作为Android资源。只是简单地掩盖你的ID与0x0000FFFF和无论你想为startActivityForResult()requestPermissions() ID,你可以使用这个简单的工具,使用它:

public static int normalizeId(int id){ 
     return id & 0x0000FFFF; 
} 

为什么?首先,让我们把这个限制背后的原因指向16位vlaue。它是片段/活动。 OS强制开发人员使用16位,而ID是32位(如整数),因为系统始终使用0xffff掩码ID,然后在来自Fragment的呼叫来自16时调用它(< < 16)。所以它是一个唯一的ID标记为片段目标ID。另一方面,通过活动发送的ID保持原样,所以它的活动目标ID。然后当结果出来时,OS知道去哪里发送片段还是活动。比方说,我们有这个ID Id=0x0001

标识在活动startActivityForResult()成为(无变化):

Id=0x0001 

标识在片段startActivityForResult()变为:

Id=0xFFFF0001 

现在怎么弄,我们可以只忽略第一个16位?让我们来看看Android中任何资源的id的解析。它构成的三个部分,HEX值构造:

PPTTVVVV 

PP:表示包ID。有其中的两个:

  • 0×01(系统包ID)
  • 0x7f的(应用程序包ID)

TT:表示类型ID。即:

  • 0x0B中:阵列
  • 0×01:ATTR
  • 0x0c:扪
  • 为0x10:颜色
  • 0x0E的:布尔
  • 0×02:抽拉
  • ..等

VVVV:代表特定包ID下特定资源类型的真正唯一标识。

正如您现在所看到的,忽略代表PPTT的第一个16位不会影响您的应用程序或导致与ID冲突。所以只能安全使用VVVV部分,这是16位值的startActivityForResult()requestPermissions()

我希望可以帮助你,'。