端末のフリップを閉じたときに音を鳴らしたり、外部キーボードを差し込んだ時にそのことを画面で通知したり、端末の状態が変化したタイミングで何らかのイベントを起こしたい時があると思います。
Androidでは、標準に用意されているonConfigurationChanged()コールバックメソッドを使用して端末のさまざまな状態の変更通知を受け取ることが可能です。
詳細は、Android Developersのドキュメントをご覧ください。
JN-DK01端末では、クラムシェル型の端末を開閉した時に起こる通知をonConfigurationChanged()で取得できます。
JN-DK01の開閉で変更が通知される値は、キーボードの使用可否状態(hardKeyboardHidden)です。
さらに、端末を開いた状態で長時間放置していた際に起きる、LCD(液晶画面)OFFのIntentが、端末を閉じた際に取得できます。
端末を開いたときは、同様にLCD ONのIntentが取得できます。
なお、標準のAndroidでは、状態の変化を明示的に受け取らなければ、現在起動中(Top)のActivityに対し、再起動(onPause→onStop→onDestroy→onCreate→onResume)がかかりますが、JN-DK01のクラムシェル開閉ではハードウェアキーボードの状態変更を伴うにも関わらず、Activityの再起動が起こりません。
これは、Android標準とは大きく異なる機能ですので、ご注意ください。
以下のセクションでは、これらの通知取得方法並びに、標準との差異の詳細、さらに、エミュレータと実機では onConfigurationChanged()で取得できる通知の値が異なる箇所があることを説明します。
画面の縦横状態が変更(画面の回転)されたり、キーボードの開閉などが起こった際に、Androidは端末の状態変化をコンフィグ値の変化として取得しています。
通知を受けたい状態変化を、Manifestファイルへ記述し、通知を受けたいActivityにてコールバックメソッド onConfigurationChanged() をオーバーライドしてください。
Manifestへ記載する通知の種類については、【その他特記事項】の列挙できる状態変化の値 を参照してください。
状態変化は端末のハード構成や、端末かエミュレータかによって異なる場合があります。
JN-DK01はフリップ開閉型のため、開閉によりキーボードの使用可能状態が変化しますが、エミュレータではフリップの開閉ができません。
状態変化通知を受ける場合には、以下に示すJN-DK01端末とエミュレータでの差異に注意して設計してください。
また、フリップ開閉に連動してLCDがON/OFFします。
これに伴い、閉じた際にはActivityライフサイクルのonPause()が、開いた際にはonResume()がコールバックされ、Intent.ACTION_SCREEN_ON/OFFがブロードキャストされます。
ブロードキャスト通知されたIntentを受け取るには、レシーバーを用意する必要があります。
ブロードキャスト通知を受け取るレシーバーについては、下記のAndroid Developersを確認してください。
参照:
Android開発の基礎
BroadcastReceiverについて
Android標準のリファレンスや、縦型スライド端末では、スライド開閉により画面が回転し、画面の縦横状態を通知するOrientationの値が変化し、さらにキーボードが利用可能・不可能と変化します。
しかし、JN-DK01は横型クラムシェル(フリップ開閉型)の形状をしているため、フリップの開閉によりキーボードの利用可能・不可能が変化しますが、フリップの開閉により画面の回転は起こりません。そのため、画面の縦横状態を通知するOrientationの値は変化しません。
従って、JN-DK01でフリップ開閉の変化を取得したい場合は、Manifestに記載するconfigChangesの属性に、"keyboardHidden"を指定してください。
エミュレータで開発する場合、先述した通り、エミュレータではフリップの開閉をエミュレートすることが出来ません。
Ctrl+F11とCtrl+F12により画面の縦横を切り替え、Orientationの値の変化に使用(イベントの代替)することは可能です。
IS01スキンを持つAVDによるエミュレートではデフォルトの値がorientation=landscape、hardKeyboardHidden=noです。
Ctrl+F11とCtrl+F12の操作によりこの両方の設定が切り替わります。
フリップ状態 | コンフィグ値の変化 (android.content.res.Configuration.hardKeyboadHidden) |
|
---|---|---|
閉じる | 実機 | HARDKEYBOARDHIDDEN_YES(2) |
エミュレーター | N/A | |
開く | 実機 | HARDKEYBOARDHIDDEN_NO(1) |
エミュレータ | 上記説明文参照 |
エミュレータでは画面回転にて、フリップ開閉の代替イベントを起こしますが、実際にJN-DK01端末で通知を受け取るには画面回転ではなくキーボードの使用可否状態の通知(keyboardHidden)を指定することに気をつけてください。
Manifestファイルの、通知を受け取りたいActivityの記述に、自身で変更通知を受け取りたいコンフィグ値を列挙します。
ここで列挙されていないコンフィグ値の変化が起きた場合、Activityへ追記するonConfigurationChanged()が呼ばれません。
通知を受け取るActivityへonConfigurationChanged()メソッドを追加します。
JN-DK01の端末開閉時は、LCDのON/OFFが同時に呼び出されます。
この通知は、無操作によるタイムアウトで起きるLCDのON/OFFと同様です。
現在起動中(TOP)のActivityに対し、onResume/onPause がコールバックされ、Inetnt.ACTION_SCREEN_ON/OFFがブロードキャスト通知されます。
フリップの状態と、Intentのブロードキャスト通知、Activityでコールバックされるサイクルは次のとおりです。
フリップ状態 | ブロードキャスト通知されるIntentの値とActivityサイクル | |
---|---|---|
閉じる | Intent | Intent.ACTION_SCREEN_OFF |
Activityサイクル | onPause | |
開く | Intent | Intent.ACTION_SCREEN_ON |
Activityサイクル | onResume |
Manifestファイルで宣言していないコンフィグ値が変化していた場合、onConfigurationChanged()は呼ばれません。
onConfigurationChanged()が呼ばれるためには、状態変化が起こる全ての値を列挙する必要があります。
android:configChanges="☆☆☆"
で記述するコンフィグ値(上記では☆の部分)は下記より、該当するものを記述してください。
複数記述する場合は、エミュレータ用のManifestファイル記述例のように="mcc|mnc|locale|fontScale" と「|」で区切って列挙してください。
値名 | 説明 |
---|---|
mcc | IMSI モバイルの国コード (MCC) が変更された。(SIM が検出され、MCC が更新された。) |
mnc | IMSI モバイルのネットワークコード (MNC) が変更された。(SIM が検出され、MNC が更新された。) |
locale | ユーザが表示したいテキストに新たな言語を選択したなど、ロケールが変更された。 |
touchscreen | タッチスクリーンが変更された。※通常は発生しない |
keyboard | ユーザが外部キーボードを差し込んだ場合など、キーボードが変更された。 |
keyboardHidden | クラムシェルを開閉するなどしてキーボードのアクセシビリティが変更された。 |
navigation | ナビゲーションタイプが変更された。※通常は発生しない |
orientation | 画面が回転した。(縦横表示の変更) |
fontScale | ユーザーが表示を変更するなどで、フォントスケールが変更された。 |