2016-06-28 77 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()

我希望可以幫助你,'。