Android で「アプリを終了したい」と調べると、finish()、finishAndRemoveTask()、moveTaskToBack(true) が候補に出てきます。名前だけ見ると似ていますが、やっていることは違います。
この記事では、最小 Activity で実際にログを取り、3つの違いを整理します。
先に比較表
| API | 何をするか | 実測したライフサイクル | プロセス |
|---|---|---|---|
finish() | 今の Activity を閉じる | onPause → onStop → onDestroy | 残った |
finishAndRemoveTask() | Activity を閉じ、タスクを最近使ったアプリ一覧から外す | onPause → onStop → onDestroy | 残った |
moveTaskToBack(true) | タスクを背面へ送る | onPause → onStop | 残った |
確認環境:
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() を使ってはいけない理由と、終了方法のまとめ にもまとめています。
どれを選ぶか
迷ったら、まずはこの順で考えるとよいです。
- 画面を閉じたいだけなら
finish() - タスクを最近使ったアプリからも消したい明確な理由があるなら
finishAndRemoveTask() - ホームへ戻したように背面へ送りたいだけなら
moveTaskToBack(true) System.exit()やProcess.killProcess()は通常の終了処理には使わない
名前が似ていても、Activity、タスク、プロセスは別物です。終了処理を書くときは、どのレイヤーを変えたいのかを分けると判断しやすくなります。