ページ

2013/08/24

[Android]Homeボタンを押されたことを検知する

Evernote を久しぶりに開いたらネタが転がっていたので記事にしておきます。

参考: Android開発 ホームボタン押下やアプリ切り替わりを検知する - えんたつの記録

Intent#ACTION_CLOSE_SYSTEM_DIALOGS | Android Developers
BroadcastReceiver を登録すれば
Home ボタンが押下されたことを検出することができます。

Intent#ACTION_CLOSE_SYSTEM_DIALOGS の特徴

  • ホームボタンが押された事自体に反応する
  • アプリがバックグラウンドにいても反応する
  • 戻るボタンが押された場合には反応しない(※戻るボタンが押された事は別の方法で取得できる)
(※ [Android]Backボタンを押されたことを検知する | DevAchieve)
参考元では Intent#ACTION_CLOSE_SYSTEM_DIALOGS の問題点として
「アプリがバックグラウンドにいても反応してしまう」ことを挙げていましたが
register したなら unregister すれば良いんじゃないの?と試してみると
うまくいったのでこの点は解消されました。

ということで onPause とかで unregisterReceiver しましょう。
private HomeButtonReceiver mHomeButtonReceiver;

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // ホームボタン押された時の Reciever の登録
    mHomeButtonReceiver = new HomeButtonReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    registerReceiver(mHomeButtonReceiver, filter);
}

private class HomeButtonReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent){
        Toast.makeText(getApplicationContext(), "ホームボタンが押されました", Toast.LENGTH_LONG).show();
        finish();
    }
}

@Override
public void onPause(){
    super.onPause();
    unregisterReceiver(mHomeButtonReceiver);
}

feedly の Android アプリは毎回リフレッシュしないで
ホームボタンとかバックボタンで閉じられたことを検知したら
次回起動時にリフレッシュすればいいんじゃないですかね。
今の onPause → onResume で毎回リフレッシュは使いづらいですよ…。