Androidで単画面アプリを作ると、ホームボタンでも戻るボタンでもホームに戻るように見える。が、アプリ的には両者は違う。ホームボタンは、ホームアプリを起動(またはフォアグラウンドに持ってくる)して現在のアプリを後ろに隠す動作になるが、戻るボタンは自分自身を終了する事によって結果的にホーム画面に戻るように見えるのだ。プロセスは終了しないがアクティビティは終了する。

ここで何が問題になるかと言うと、スプラッシュを別アクティビティで作っている場合(例えばSplashActivity表示→3秒待つ→MainActivityを起動してSplashActivityは終了する)、ホームボタンの後でアプリアイコンをタップするとMainActivityに戻るが、戻るボタンの後でアプリアイコンをタップするとまたスプラッシュが表示されるのだ。この差を埋めるためには、戻るボタンを押した時にfinish()するのではなくてホームアプリを起動するようにすれば良い。戻るボタンが押されたかどうかはdispatchKeyEventでKEY_CODEを調べれば判定できる。そこでデフォルトの動作をさせずにホームアプリを起動するには以下のようなコードを該当のActivityに書けばOK。

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
  if (event.getAction() == KeyEvent.ACTION_DOWN) {
    switch (event.getKeyCode()) {
    case KeyEvent.KEYCODE_BACK:
      Intent intent = new Intent(Intent.ACTION_MAIN);
      intent.addCategory(Intent.CATEGORY_HOME);
      intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);
      this.getApplicationContext().startActivity(intent);
      return true;
    }
  }
  return super.dispatchKeyEvent(event);
}