LoginSignup
2
2

More than 5 years have passed since last update.

[備忘録]AndroidでFragmentActivityのrequestCodeの範囲 (In-app Billingなどで使う、start~ForResult()などに影響。)

Last updated at Posted at 2016-09-18

FragmentActivityのstart~ForResult()などは、requestCodeの範囲に制限がある。

リファレンスに書いてないので、(support.v4を使う場合は)要注意。

requestCodeの範囲

[support.v4.app.FragmentActivity]
startActivityFromFragment()に関連するもの:16bit(0~65535?)

onActivityResult()に関連するもの:16bit(0~65535?)

requestPermissionsFromFragment()、
onRequestPermissionsResult()などに関連するもの:16bit(0~65535?)
※旧ソースでは8bit(0~255)

※詳細は・・FragmentActivityなどの、ソースコードを参照。
該当箇所は、あちこちに散らばっている。
(FragmentActivity以外では、BaseFragmentActivityGingerbreadなど。)

検索キーワード:
checkForValidRequestCode
requestCode
ffff
>> 16
-1
など。

処理待ちのフラグメント数の上限

support.v4.app.FragmentActivityの処理待ちのフラグメント数は、
allocateRequestIndex()で制限されている。
(管理用のインデックスの上限は65534。requestCodeの上位16bitに、このインデックスを格納している。)

補足1 エラーの例

この制限にかかると、startIntentSenderForResult()などを呼んだ時に、
java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
などが表示されます。

補足2 範囲制限の原因

FragmentActivityで、requestCodeの一部を、フラグメントの管理(上側16bit)などに使っているから。
※旧ソースでは、24(16+8)bit

補足3 FragmentのstartActivityForResult()なども、requestCodeに制限がある

android.app.Fragment、android.support.v4.app.Fragmentともに、
startActivityForResult()、startIntentSenderForResult()、startIntentSenderForResult()などの引数のrequestCodeは、-1のみに制限されている。

Fragment.startActivityForResult()
-> FragmentHostCallback.onStartActivityFromFragment()
が呼ばれて、ここで制限される。
詳細は、ソース参照で。

参考

[Stackoverflow - Android: what to choose for requestcode values?]
http://stackoverflow.com/questions/33331073/android-what-to-choose-for-requestcode-values
※一部、旧ソースが含まれるので注意

変更があったのは、このあたり。
[Git repositories on android]
変更ログ - 86f3b80 Dispatch onRequestPermissionsResult to child fragments
https://android.googlesource.com/platform/frameworks/support/+/86f3b80ddf7f9aa5c5b7afe77217cb75632d62a2

[FragmentActivity.javaの変更ログ]
https://android.googlesource.com/platform/frameworks/support/+log/refs/heads/master/v4/java/android/support/v4/app/FragmentActivity.java

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2