Android の finish() / finishAndRemoveTask() / moveTaskToBack() の違い

Android で「アプリを終了したい」と調べると、finish()finishAndRemoveTask()moveTaskToBack(true) が候補に出てきます。名前だけ見ると似ていますが、やっていることは違います。

この記事では、最小 Activity で実際にログを取り、3つの違いを整理します。

比較表

API何をするか実測したライフサイクルプロセス
finish()今の Activity を閉じるonPauseonStoponDestroy残った
finishAndRemoveTask()Activity を閉じ、タスクを最近使ったアプリ一覧から外すonPauseonStoponDestroy残った
moveTaskToBack(true)タスクを背面へ送るonPauseonStop残った

確認環境:

Android Emulator Medium_Phone_API_36.0
Android 16 / API 36
targetSdkVersion 36
確認日 2026-07-14

finish(): 今の Activity を閉じる

finish() は、現在の Activity を終了します。

finish()

実測ログ:

I/ExitProbe: onCreate pid=11507
I/ExitProbe: onStart pid=11507
I/ExitProbe: onResume pid=11507
I/ExitProbe: runMode finish pid=11507
I/ExitProbe: onPause pid=11507
I/ExitProbe: onStop pid=11507
I/ExitProbe: onDestroy pid=11507
pid_after_18s=11507

Activity は onDestroy まで進みましたが、プロセスは残りました。finish() はアプリプロセスを殺すAPIではありません。

画面を閉じたいだけなら、基本はこれで十分です。

finishAndRemoveTask(): タスクも最近使ったアプリから外す

finishAndRemoveTask() は、Activity を終了し、その Activity が属するタスクを最近使ったアプリ一覧から外します。

finishAndRemoveTask()

実測ログ:

I/ExitProbe: onCreate pid=11548
I/ExitProbe: onStart pid=11548
I/ExitProbe: onResume pid=11548
I/ExitProbe: runMode finish_remove pid=11548
I/ExitProbe: onPause pid=11548
I/ExitProbe: onStop pid=11548
I/ExitProbe: onDestroy pid=11548
pid_after_18s=11548

Activity のライフサイクルだけ見ると、finish() とかなり似ています。違いはタスクの扱いです。

ログアウト完了後や、ワンショットの認証フローなど、「このタスクを最近使ったアプリに残したくない」理由があるときに検討します。普通の戻る操作の代わりに毎回使うAPIではありません。

moveTaskToBack(true): 終了ではなく背面送り

moveTaskToBack(true) は、タスクを背面へ送ります。ホームボタンを押したときに近い挙動です。

moveTaskToBack(true)

実測ログ:

I/ExitProbe: onCreate pid=11587
I/ExitProbe: onStart pid=11587
I/ExitProbe: onResume pid=11587
I/ExitProbe: runMode move_task_back pid=11587
I/ExitProbe: onPause pid=11587
I/ExitProbe: onStop pid=11587
pid_after_18s=11587

onDestroy は呼ばれませんでした。Activity は停止状態になり、タスクが背面に回っただけです。

「終了ボタン」でこれを呼ぶと、ユーザーからはアプリが閉じたように見えます。ただし、実際には終了ではありません。あとで最近使ったアプリから戻れば、同じタスクに戻ります。

System.exit() とは別物

この3つはどれも、System.exit() の代わりにプロセスを殺すAPIではありません。

System.exit(0) を同じ最小アプリで試すと、Activity の onPause / onStop / onDestroy は出ず、システム側に次のようなログが出ました。

I/ExitProbe: runMode system_exit pid=11636
I/ActivityManager: Process net.ecoop.exitprobe (pid 11636) has died: fg  TOP
W/ActivityTaskManager: Force removing ActivityRecord{...}: app died, no saved state
pid_after_18s=

終了方法の比較は Android で System.exit() を使ってはいけない理由と、終了方法のまとめ にもまとめています。

どれを選ぶか

迷ったら、まずはこの順で考えるとよいです。

  1. 画面を閉じたいだけなら finish()
  2. タスクを最近使ったアプリからも消したい明確な理由があるなら finishAndRemoveTask()
  3. ホームへ戻したように背面へ送りたいだけなら moveTaskToBack(true)
  4. System.exit()Process.killProcess() は通常の終了処理には使わない

名前が似ていても、Activity、タスク、プロセスは別物です。終了処理を書くときは、どのレイヤーを変えたいのかを分けると判断しやすくなります。