ホームボタンを押してアプリがバックグラウンドに回る時や、他のアプリに遷移した時に、メッセージを出したりする方法を検討しました。この記事は、その時に試したソースコードや特徴をまとめたものです。
なお結論としては、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 グループ
@tattyamm




