ホームボタンを押してアプリがバックグラウンドに回る時や、他のアプリに遷移した時に、メッセージを出したりする方法を検討しました。この記事は、その時に試したソースコードや特徴をまとめたものです。
なお結論としては、onUserLeaveHint()を使う方法が最も良いでしょう。こちらに全体のソースコードを置きました。
調べた所、onUserLeaveHint()を使う方法とIntent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法の2通りがあるようです。それぞれ見てきましょう。
■onUserLeaveHint()を使う方法
・Activityがバックグラウンドに行くと呼ばれます。
・ホームボタンが押された時の他、通知領域から他のアプリに遷移した場合などにも反応します。
・他アプリ起動やActivityの切替全てに反応してしまう。
・戻るボタンが押された場合には反応しません(戻るボタンが押された事は別の方法で取得できる)。
・こちらを参考にしました:Y.A.M の 雑記帳: Android Home キーが押されたことを検知する。
■Intent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法
・ホームボタンが押された事自体に反応する。
・しかし、アプリがバックグラウンドにいても反応してしまう。
・戻るボタンが押された場合には反応しません(戻るボタンが押された事は別の方法で取得できる)。
・こちらを参考にしました;ビデオ再生中にホームキーが押された場合 - 日本Androidの会 | Google グループ
■これらを改良する(してみようとする)
これらが基本的な方法です。これを少し改良してみましょう。
■onUserLeaveHint()を使う方法を改良する
onUserLeaveHint()を使う方法だと、戻るボタンが押された時に反応しません。なのでonKeyDown()を追加して、戻るボタンのイベントを取得します。
よくあるものです。これでホームボタンやバックボタンが押された時や、他のアプリに切り替えた時に反応してくれます。どういう時に反応するのかもっとテストが必要ですが、基本的にはこれで十分でしょう。
今回の記事を書くのをきっかけにgithubアカウントを作りました。これを含めた全体のソースコードは私のgithubアカウントに置いたので、そちらを参照して下さい。
■Intent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法を改良する
このIntent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法について、自分自身がトップにいないのにも関わらずホームボタンが押された事に反応する問題に対処してみます。しかしどうも上手く行っていません…。
・アプリがバックグラウンドに行くタイミングでfinish();やandroid.os.Process.killProcess(Process.myPid());などによりアプリを終了する方法ですが、なぜか上手くいきません。
・自分がバックグラウンドではなく、表で起動しているかをフラグにて管理する方法を試してみました。アプリが起動したらフラグはtrueに、ホームボタンが押されたらフラグはfalseに、onResume()でフラグをtrueに、といった感じでフラグを管理します。しかしonUserLeaveHint()でフラグをfalseにできれば良いのですが、onUserLeaveHint()の方がHomeButtonReceiveより後に呼ばれるようで、他のアプリに遷移した後にホームボタンを押すと反応してしまうのは防げません。
・こちらのコードを参考にトップにあるパッケージネームを取得して、自分自身と一致するときだけメッセージを出すって方法が良さそうなんですが、ちょっと上手く行きません(ちゃんとわかってる人が書けばちゃんと動きそう。パーミッションも必要なので少々大げさかも。
■まとめ
色々やってみましたが、シンプルにonUserLeaveHint()だけを使う方法が最も有効です。
自分は上にも書いたような方法で、戻るボタン検知と組み合わせて使っています。ここに全体を置いておきます。
(そもそもホームボタンが押された時というのは、ユーザーがアプリを消そうとした時です。そのような時にメッセージを出したりなど、何かすべきでは無いのかもしれません。どうしても必要な場合に行いましょう。)
■参考サイト
・[Android]アプリを(擬似的に)シングルタスクにする方法 - chakimarの日記
・Y.A.M の 雑記帳: Android Home キーが押されたことを検知する。
・ホームボタンが押されたことを取得する方法 - 日本Androidの会 | Google グループ
・ビデオ再生中にホームキーが押された場合 - 日本Androidの会 | Google グループ
なお結論としては、onUserLeaveHint()を使う方法が最も良いでしょう。こちらに全体のソースコードを置きました。
調べた所、onUserLeaveHint()を使う方法とIntent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法の2通りがあるようです。それぞれ見てきましょう。
■onUserLeaveHint()を使う方法
・Activityがバックグラウンドに行くと呼ばれます。
・ホームボタンが押された時の他、通知領域から他のアプリに遷移した場合などにも反応します。
・他アプリ起動やActivityの切替全てに反応してしまう。
・戻るボタンが押された場合には反応しません(戻るボタンが押された事は別の方法で取得できる)。
・こちらを参考にしました:Y.A.M の 雑記帳: Android Home キーが押されたことを検知する。
package jp.sample.AndroidPressHomeKeyEventSample; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.widget.Toast; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onUserLeaveHint(){ //ホームボタンが押された時や、他のアプリが起動した時に呼ばれる //戻るボタンが押された場合には呼ばれない Toast.makeText(getApplicationContext(), "Good bye!" , Toast.LENGTH_SHORT).show(); } }
■Intent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法
・ホームボタンが押された事自体に反応する。
・しかし、アプリがバックグラウンドにいても反応してしまう。
・戻るボタンが押された場合には反応しません(戻るボタンが押された事は別の方法で取得できる)。
・こちらを参考にしました;ビデオ再生中にホームキーが押された場合 - 日本Androidの会 | Google グループ
package jp.sample.activityFinishSample02; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //ホームボタン押された時の準備 HomeButtonReceive m_HomeButtonReceive = new HomeButtonReceive(); IntentFilter iFilter = new IntentFilter(); iFilter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); this.registerReceiver(m_HomeButtonReceive, iFilter); } public class HomeButtonReceive extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1){ //ここにさせたい事を書く Toast.makeText(getApplicationContext(), "Good bye!" , Toast.LENGTH_SHORT).show(); } } }
■これらを改良する(してみようとする)
これらが基本的な方法です。これを少し改良してみましょう。
■onUserLeaveHint()を使う方法を改良する
onUserLeaveHint()を使う方法だと、戻るボタンが押された時に反応しません。なのでonKeyDown()を追加して、戻るボタンのイベントを取得します。
package jp.sample.AndroidPressHomeKeyEventSample; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.widget.Toast; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onUserLeaveHint(){ //ホームボタンが押された時や、他のアプリが起動した時に呼ばれる //戻るボタンが押された場合には呼ばれない Toast.makeText(getApplicationContext(), "Good bye!" , Toast.LENGTH_SHORT).show(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch(keyCode){ case KeyEvent.KEYCODE_BACK: //戻るボタンが押された時の処理。 Toast.makeText(this, "Back button!" , Toast.LENGTH_SHORT).show(); finish(); return true; } return false; } }
よくあるものです。これでホームボタンやバックボタンが押された時や、他のアプリに切り替えた時に反応してくれます。どういう時に反応するのかもっとテストが必要ですが、基本的にはこれで十分でしょう。
今回の記事を書くのをきっかけにgithubアカウントを作りました。これを含めた全体のソースコードは私のgithubアカウントに置いたので、そちらを参照して下さい。
■Intent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法を改良する
このIntent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法について、自分自身がトップにいないのにも関わらずホームボタンが押された事に反応する問題に対処してみます。しかしどうも上手く行っていません…。
・アプリがバックグラウンドに行くタイミングでfinish();やandroid.os.Process.killProcess(Process.myPid());などによりアプリを終了する方法ですが、なぜか上手くいきません。
・自分がバックグラウンドではなく、表で起動しているかをフラグにて管理する方法を試してみました。アプリが起動したらフラグはtrueに、ホームボタンが押されたらフラグはfalseに、onResume()でフラグをtrueに、といった感じでフラグを管理します。しかしonUserLeaveHint()でフラグをfalseにできれば良いのですが、onUserLeaveHint()の方がHomeButtonReceiveより後に呼ばれるようで、他のアプリに遷移した後にホームボタンを押すと反応してしまうのは防げません。
・こちらのコードを参考にトップにあるパッケージネームを取得して、自分自身と一致するときだけメッセージを出すって方法が良さそうなんですが、ちょっと上手く行きません(ちゃんとわかってる人が書けばちゃんと動きそう。パーミッションも必要なので少々大げさかも。
■まとめ
色々やってみましたが、シンプルにonUserLeaveHint()だけを使う方法が最も有効です。
自分は上にも書いたような方法で、戻るボタン検知と組み合わせて使っています。ここに全体を置いておきます。
(そもそもホームボタンが押された時というのは、ユーザーがアプリを消そうとした時です。そのような時にメッセージを出したりなど、何かすべきでは無いのかもしれません。どうしても必要な場合に行いましょう。)
■参考サイト
・[Android]アプリを(擬似的に)シングルタスクにする方法 - chakimarの日記
・Y.A.M の 雑記帳: Android Home キーが押されたことを検知する。
・ホームボタンが押されたことを取得する方法 - 日本Androidの会 | Google グループ
・ビデオ再生中にホームキーが押された場合 - 日本Androidの会 | Google グループ