android - 在 Android 中为 startActivityForResult() 生成 16 位唯一 ID

标签 android resources

我计划为我所有的 startActivityForResult() 代码使用生成的资源 ID,这样我就可以在基类中使用 onActivityResult() 而不必担心如果派生类使用相同的代码。

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

最佳答案

其实是有的。此外,您可以使用标准 id 作为 Android 资源。只需用 0x0000FFFF 屏蔽您的 ID,然后在任何您想要的地方使用它作为 startActivityForResult()requestPermissions() 的 ID,您可以使用这个简单的效用:

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

为什么? 首先,让我们指出 16 位值限制背后的原因。这是 fragment/Activity 。操作系统强制开发人员使用 16 位,而 ID 是 32 位(作为整数),因为系统总是用 0xffff 屏蔽 id,然后在调用来自 Fragment 时将其转换为 16 (<<16)。所以它是一个标记为 fragment 目标 ID 的唯一 ID。另一方面,通过 Activity 发送的 ID 保持原样,因此它的 Activity 目标 ID。然后当结果出来时,OS 知道发送到哪里是 Fragment 还是 Activity。假设我们有这个 id Id=0x0001

Activity 中 startActivityForResult() 中的 Id 变为(无变化):

Id=0x0001

Fragment 中 startActivityForResult() 中的 Id 变为:

Id=0xFFFF0001

现在我们怎么可以忽略前 16 位?让我们看一下 Android 中任何资源的 id 的剖析。它由三部分组成,作为 HEX 值构造:

PPTTVVVV

PP:表示包id。其中有两个:

  • 0x01(系统包ID)
  • 0x7f(应用程序包 ID)

TT:代表类型Id。即:

  • 0x0b : 数组
  • 0x01 : 属性
  • 0x0c : 维度
  • 0x10 : 颜色
  • 0x0e : bool 值
  • 0x02:可绘制
  • ..等

VVVV:表示特定包id下特定类型资源的真实唯一标识。

正如您现在看到的,忽略代表 PPTT 的前 16 位不会对您的应用产生影响或导致与 ID 冲突。所以安全地只使用 VVVV 部分,它是 startActivityForResult()requestPermissions()

中的 16 位值

希望对您有所帮助,'。

关于android - 在 Android 中为 startActivityForResult() 生成 16 位唯一 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38072322/

相关文章:

android - 如何将 .apk 文件安装到模拟器?

android - 这适用于所有屏幕尺寸吗?

android - 使用 for 循环以编程方式将元素添加到 FrameLayout

android - 如何从android将阿拉伯数据插入mysql数据库

database - 寻找多语言开源翻译词典平面文件或数据库

android - 如何在 Android 上启用 OpenGL 扩展 GL_EXT_shader_framebuffer_fetch?

Android读取文本原始资源文件

c - 如何使用最少的系统资源在 ANSI C 中创建 "infinite"系列的交替符号?

delphi - 有什么方法可以在编译时添加 .map 文件作为项目的资源吗?

android - 在哪里可以阅读有关 id 属性格式的信息?