mucchinのAndroid戦記

AndroidアプリでBackキーのイベントを拾う方法

Androidアプリで、Backキー(戻るボタン)を押されたイベントを拾う(受け取る)方法は?

本題に入る前に、少しだけ話しを逸らしてしまいます。
かなり久しぶりの「mucchinのAndroid戦記」サイトの更新です。
約50日振りですね。
実務が忙しくなってしまったため、プライベートでやってたAndroidのアプリ開発的な作業もストップしていました。
やっと少しだけ時間が空いたので、以前から作りかけていたAndroidアプリの開発の続きをしてみました。
やっぱり少しでも間が空くと、若干ブランクが否めないですね。
Androidに関する事ならまだしも、自分が作っていたAndroidアプリの作りの事を結構忘れてしまって、大変です。(苦笑)


では、本題に入りたいと思います。
今回は、Androidアプリで、Backキーを押されたときのイベントを拾う方法についてです。

私は今、GPS機能を使ったAndroidアプリを作っていまして、それをXPERIAにインストールしてテストをしてみました。
例えば、室内などでGPS測位をしても、測位ができずに処理が終わりません。
その状態で、そのActivityを終了させても、XPERIAの画面上部に出てる測位中アイコンのようなアイコンが、ピコピコと動きっぱなしになっている事に気付きました。
そこで、そのまま測位しっぱなしは、さすがにどうかと思いましたので、Activity終了時にGPS測位のキャンセルをしたいな、と思いました。

自分でAndroidアプリ上に設置した「戻る」ボタンでは、当然押されたらイベントを受け取って、好きな処理が出来ます。(onClickListenerで。)
ここに、GPS測位のキャンセル処理を入れる事で、自作の戻るボタン押下でのActivity終了時は問題なく、測位をキャンセルしてくれました。
でも、これだけでは、ハード側のBackキーを押された場合は、測位動作がキャンセルされません。
では、ハードキーとして存在するBackキーを押されたときはどうしたらいいのか、を説明します。

ActivityのonDestroy()イベント

Backキーを押されたら何をしたいのか?という目的によっては、処理の仕方が違うと思います。
私のように、Activity終了時には、動かしている処理をキャンセルさせたいとか、何かを解放したいとかいう処理の場合は、ActivityのonDestroy()メソッドを実装して、処理を記述するとよいでしょう。
Activity終了時には、onDestroyイベントが発生します。
もちろん、finish()メソッドで終了させた後も、このonDestroyイベントが発生するので、自作した終了ボタン押下時に入れている処理で、解放やらキャンセル等の処理を入れているのであれば、onDestroy()に実装するとよいと思います。


スポンサーリンク




ActivityのonKeyDown()イベント

「Backキーを無視させたい」というときにどうするのか、を説明します。
但し、こんな処理は、ユーザにとって不親切だと思うので、あまり推奨はしません。
キー押下時には、onKeyDownイベントが発生しますので、Activityに、onKeyDown()メソッドを実装します。
そして、例えば以下のようなコードにします。


public boolean onKeyDown(int keyCode, KeyEvent event) {
  if(keyCode != KeyEvent.KEYCODE_BACK){
    return super.onKeyDown(keyCode, event);
  }else{
    return false;
  }
}
KeyEvent.KEYCODE_BACKは、android.view.KeyEventクラスの定数で、Backキーを示します。
Backキーだったら、superクラスのonKeyDown()をコールさせない、とする事で、Backキーの処理は、ここで終了する事になり、前画面へ戻らなくなります。

もし、このような処理を実装するのであれば、「Backキーではなく、戻るボタンを押して終了してください。」みたいなメッセージを表示させる等、くれぐれもユーザの迷惑にならないようにしてあげてくださいね。


Androidのエミュレータでは、GPSの測位中アイコンみたいなアイコンが表示されていなかったので、問題ないと思っていたのですが、実際XPERIAで動かしてみると、ちょろちょろと問題が見つかります。

皆さんもAndroidアプリを開発されているのでしたら、是非実機の入手をおススメします。
画面サイズも違ったりするので、エミュレータで動かすのと、XPERIAで動かすのでは、やっぱり雰囲気が違いますね。