- ブログ
AndroidManifest.xml 〜 android:configChangesのnavigationについて
2024.02.20 Tue

エンジニアのikkaです。
先日、個人PCで某ゲームのマルチプレイ用サーバを立ててみたところ、メモリ32GBでは不足となり慌てて64GBへ増設していたりしました。
余談はさておき、今回はAndroidManifestの設定項目「configChanges」のお話です。
どうしてnavigationに注目したのか
最近の案件でバーコードスキャナーを使用するアプリの開発を行なったのですが、スキャナーの接続や解除時にアプリのActivityが再起動してしまう問題が発生しました。
いつもお世話になっている stackoverflow で調べてみると、AndroidManifest.xml の activityタグに設定を追加することでActivityの再起動がなくなると分かったのですが、
- android:configChanges=”keyboard|keyboardHidden”を入れるといいよ
- keyboardとkeyboardHiddenの他にnavigationも入れないとだめだよ
といった感じで、navigation を含んでいたり、含んでいなかったり一定していなかったので、navigation役割は何だろう?と思ったのがきっかけです。
なお、configChangesの詳細は、Android Developersガイド「構成の変更に対処する」に記載されています。
本題
navigationの設定値について、Android Developersガイド「<アクティビティ>」には以下のように説明されています。
ナビゲーション タイプ(トラックボールまたは D-pad)への TA の変更。通常、このようなことは起こりません。
D-pad(十字キー)やトラックボールのような機器を接続して、認識されたら変化するよ、ということのようです。
「通常は起こらない」ありますが、実際に試してみると・・・
navigationが変化したもの
- Logicool の Bluetoothキーボード(MX Keys)
- 社内にあったバーコードスキャナー2種のうちの一方
onConfigurationChangedコールバックのパラメータが、NAVIGATION_NONAV から NAVIGATION_DPAD へ変化!
navigationが変化しなかったもの
- Logicool の Bluetoothマウス(MX Master 3)
- 社内にあったバーコードスキャナー2種のうちの一方
あら不思議、身近な機器で、navigationが変化してる!!!
結論
公式リファレンスの navigation 項目には「通常、このようなことは起こりません」と記載があるものの、現実の話として、一部の外部機器の接続によって変化する可能性があることが分かりました。
外部機器接続時に、Activityの再起動を避けるのであれば、android:configChangesには、navigation を設定することは必要という結論になりました。
ついでに、Flutterも
Flutterでプロジェクトを生成すると、AndroidManifest.xml は下の内容で生成されます。
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"どういうわけだけ、navigation だけが、存在しない!ので、必要に応じて、追加しましょう!