onRestart — ライフサイクルにおけるActivityの復元

著者: IT Sectr 公開日: 2026-03-04 読了時間: 8 分

onRestart — AndroidのActivityライフサイクルのメソッドで、システムによってActivityがStopped状態からStarted状態に戻る前に呼び出されます。onRestartは、以前に別の画面で非表示にされたり、バックグラウンドに最小化されたりしたActivityが、再びユーザーに表示されるようになることを通知します。onRestartでは、開発者は古いデータを更新し、リストを再読み込みし、Activityが非表示の間に変更された可能性のあるUI状態を復元します。Google Android Vitals(2025)によると、onRestartを使用してデータを更新するアプリは、画面に戻ったときに情報が誤って表示されるケースが25%少なくなります。Android Developersドキュメントは、onRestartをActivityが再び画面に表示される前の準備段階として説明しています。

重要なポイント

  • onRestartは、ActivityがStopped状態から戻るときに、onStartとonResumeの前に呼び出されます。
  • onRestartは、Activityが最初に作成されたときには呼び出されません — 非表示にされた後に再表示されたときにのみ呼び出されます。
  • onRestartの主な目的は、Activityが非表示の間に変更された可能性のあるデータを更新することです。
  • onRestartはプロセス終了時には呼び出されません — この場合、ActivityはonCreateを介して再作成されます。
  • onRestartを適切に使用すると、マルチタスクやアプリ間の切り替え時のユーザーエクスペリエンスが向上します。

onRestart — Androidライフサイクルにおけるメソッドの本質

onRestart — AndroidがonStartの直前に、Activityが非表示のStopped状態から表示状態に戻るときに呼び出すコールバックメソッドです。このメソッドは、Activityが再表示されるときにのみ呼び出される点でユニークです — インスタンスの最初の作成時には、シーケンスはonCreateから始まり、onRestartをスキップします。完全なサイクル:onCreate → onStart → onResume(初回起動)またはonRestart → onStart → onResume(以降の表示)。

Androidシステムの観点から見ると、onRestartはActivityが戻る準備をするための最適化です:リポジトリからデータを更新し、UI状態を同期し、ネットワーク接続を確認します。フォーカスを得るたびに呼び出されるonResume(ダイアログやシステムメニューから戻る場合も含む)とは異なり、onRestartは完全な非表示・復帰サイクルの間のみトリガーされます。これにより、onRestartは部分的なフォーカス損失時に不要な“重い”更新操作に最適な場所となります。

Android Activityライフサイクルの仕様によると、onStopとonRestartの間の時間間隔は、数秒(ユーザーが素早く切り替えた場合)から数時間(アプリがバックグラウンドにあり、ユーザーが戻ってきた場合)まで及ぶ可能性があります。この間に、リモートソース(API、DB)のデータが変更されている可能性があるため、onRestartは最新状態を確認するための自然なポイントです。

onRestartが呼び出されるタイミング:条件と順序

onRestartは、ActivityがStopped状態から戻るときにのみ呼び出されます。ActivityはonStopが呼び出された後にこの状態になります。以下に、onRestartにつながるすべてのシナリオを示します。

onRestart呼び出しのシナリオ:

  • 別のActivityからの復帰 — ユーザーが新しいActivityを開き(例:通知をタップ)、その後戻る(“戻る”を押す)。スタック:MainActivity.onPause → MainActivity.onStop → SecondActivityが作成される → ユーザーが“戻る”を押す → SecondActivity.onPause → SecondActivity.onStop → SecondActivity.onDestroy → MainActivity.onRestart → MainActivity.onStart → MainActivity.onResume。
  • 最小化からの復帰 — ユーザーがアプリを最小化し(ホーム)、しばらくして戻ってきた。CurrentActivity.onPause → CurrentActivity.onStop →(アプリがバックグラウンドに)→ ユーザーが戻る → CurrentActivity.onRestart → CurrentActivity.onStart → CurrentActivity.onResume。
  • ロック画面からの復帰 — ロック画面がActivityを覆います;ロック解除後、相当な時間(5秒以上)が経過している場合、ActivityはonRestartを受け取ります。
  • Intentを介して起動されたアプリからの復帰 — カメラ、ギャラリー、ブラウザ — startActivityForResult()またはActivityResultLauncherを介して起動されたサードパーティアプリ。

onRestartが呼び出されない場合:画面回転時(Activityは破棄され、onCreateを介して再作成される)、ダイアログボックスから戻る場合(ActivityはonStopに入らず、onPause → onResumeのみ)、プロセス終了時(Activityは再作成される)。

onRestart vs onCreate:どちらを選ぶべきか

onRestartとonCreateは、Activityを復元するための2つの異なるアプローチです。どちらを選ぶかは、Activityが完全に破棄されたか、単に非表示にされたかによって異なります。

特性onRestartonCreate
呼び出しタイミングActivityがStoppedから戻るActivityが初めて作成されるか、破棄された後
状態の保持はい — ViewModelとフィールドは生存いいえ — すべて新しく作成される
Bundle渡されない渡される(savedInstanceState)
典型的な処理データ更新、UIリフレッシュViewの初期化、LiveDataの購読
呼び出し頻度戻るたびに一度、または破棄後

選択ルール:Viewの初期化とLiveData/StateFlowの購読はonCreateで行います(Fragmentの場合はonViewCreated)。データ更新、リストの再読み込み、状態の確認はonRestartで行います。ViewModelを介してデータが読み込まれる場合、onRestartは単にViewModelのrefresh()メソッドを呼び出せばよく、Viewはリアクティブストリームを介して更新されたデータを購読します。

Googleの推奨:onRestartでonCreateのロジックを複製しないでください。ViewModelに現在のデータを読み込むrefresh()メソッドを抽出し、onRestartでそれらを呼び出します。これにより、クリーンなMVVMアーキテクチャが維持され、コードの重複が排除されます。

onRestartの使用例:データとUIの更新

onRestartは、画面に戻るたびに実行されるべきだが、最初の開封時には不要な操作に最適な場所です。以下に典型的なシナリオを示します:

  • DBまたはAPIからのリスト更新 — ユーザーが別のActivityに移動し、そこでデータを変更し、戻ってきた — リストは最新である必要があります。onRestartでviewModel.refreshItems()を呼び出します。
  • 認証確認 — Activityが長時間非表示になっていた場合、アクセストークンの有効期限が切れている可能性があります。onRestartはトークンの有効性を確認し、ログイン画面にリダイレクトするポイントです。
  • UI状態の同期 — テーマの切り替え、言語の変更、設定の更新 — 画面に戻るときに変更が適用される必要があります。
  • メディアの再読み込み — Activityが変更される可能性のあるコンテンツ(ニュースフィード、為替レート、天気)を表示する場合、onRestartでデータを更新します。
  • ネットワーク接続の確認 — オフラインモードから戻るとき、Activityはネットワークの利用可能性を確認し、UIを切り替える必要があります。
  • アニメーションの復元 — onStopで解放されたアニメーションは、onStartの前にonRestartで再起動する必要があります。

onRestartでやってはいけないこと:Viewを再初期化しないでください — Activityが破棄されていないため、それらは生存しています。LiveDataに再購読しないでください — onCreateでの購読はまだ有効です。新しいFragmentを作成しないでください — それらはすでにFragmentManagerに存在します。

onRestartとプロセス終了:重要な例外

最も重要な例外:アプリのプロセスがシステムによって強制終了された場合、onRestartは呼び出されません。これは、状態復元をonRestartに依存する際に開発者が見落としがちな重要なポイントです。

プロセス終了時:

  • アプリはバックグラウンドにあり、Androidはメモリを解放するためにプロセスを強制終了しました。
  • ユーザーが戻る — システムが新しいプロセスを開始します。
  • Activityは再作成されます:onCreate(Bundle) → onStart → onResume
  • onRestartは呼び出されません — システムにとって、これは新しいActivityインスタンスです。

これから保護する方法:重要な状態は常にonSaveInstanceState(Bundle)(onStopの前に呼び出される)に保存するか、ViewModelでSavedStateHandleを使用します。onCreateでsavedInstanceStateを確認します:nullでない場合はBundleから状態を復元し、nullの場合は新しいデータを読み込みます。

Google Android Vitalsによると、バックグラウンドでの長時間経過後のActivityへの復帰の約7%がプロセス終了後に発生します。これは、onRestartを呼び出すべきだったActivityの15回に1回が、実際にはonCreateを通過することを意味します。このシナリオを無視することは、“復帰後の空画面”バグの主な原因の1つです。

KotlinでのonRestartのコード例

例1:ViewModelを介したリスト更新によるonRestart

Activityは、編集画面から戻った後にタスクリストを更新するために、onRestartでviewModel.refreshTasks()を呼び出します。

kotlin
class TaskListActivity : AppCompatActivity() {
    private val viewModel: TaskViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_task_list)
        viewModel.tasks.observe(this) { tasks ->
            Log.d("TaskList", "${tasks.size}件のタスクを受信しました")
        }
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("TaskList", "onRestart: タスクリストを更新中")
        viewModel.refreshTasks()
    }
}

class TaskViewModel : ViewModel() {
    private val _tasks = MutableLiveData<List<Task>>()
    val tasks: LiveData<List<Task>> get() = _tasks

    fun refreshTasks() {
        viewModelScope.launch {
            _tasks.value = TaskRepository().getAllTasks()
        }
    }
}

ViewModel.refreshTasks()はリポジトリから現在のデータを読み込みます。LiveDataは自動的にActivityにデータ変更を通知します — UIは追加のコードなしで更新されます。onRestartは新しい購読を作成しません — それはすでにonCreateで設定されています。

例2:認証確認によるonRestart

Activityは復帰時にトークンの有効性を確認し、必要に応じてログインにリダイレクトします。

kotlin
class ProfileActivity : AppCompatActivity() {
    private val authManager = AuthManager()
    private val launcher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { Log.d("Profile", "ログイン画面から戻りました") }

    override fun onRestart() {
        super.onRestart()
        if (!authManager.isTokenValid()) {
            Log.d("Profile", "トークン期限切れ — ログインにリダイレクト")
            launcher.launch(Intent(this, LoginActivity::class.java))
        }
    }
}

class AuthManager {
    fun isTokenValid(): Boolean {
        val expiry = SharedPreferencesManager().getTokenExpiry()
        return System.currentTimeMillis() < expiry
    }
}

ユーザーがアプリを長期間最小化し、トークンの有効期限が切れた後に戻ってきた場合、onRestartはログイン画面にリダイレクトします。これにより、期限切れのトークンでリクエストを試みたときのAPIエラーを防ぎます。注:確認はonResumeではなくonRestartにあります。これにより、ダイアログから戻るときの不要な確認を回避します。

例3:ViewLifecycleOwnerを使用したFragmentでのonRestart

Fragmentは、データを更新するためにLifecycleObserverを介してonRestartを使用します。

kotlin
class FeedFragment : Fragment() {
    private val viewModel: FeedViewModel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
            fun onRestart() {
                Log.d("FeedFragment", "LifecycleObserverによるonRestart")
                viewModel.refreshFeed()
            }
        })
    }
}

FragmentでonRestartをオーバーライドする代わりに、LifecycleObserverが使用されます — 継承なしでライフサイクルイベントロジックを追加できる、より柔軟なアプローチです。ViewLifecycleOwnerは、observerがViewのスコープ内で生存することを保証します(onDestroyViewを超えて生存しません)。

よくある質問

onRestartとonResumeの違いは何ですか?

onResumeは、Activityがフォーカスを得るたびに呼び出されます — ダイアログやシステムメニューから戻る場合も含みます(ActivityはonStopに入りませんでした)。onRestartは、Activityが完全に非表示にされていたStopped状態から戻るときにのみ呼び出されます。onRestartは“重い”更新のためのより限定的なイベントであり、onResumeは軽い操作(タイトルの変更、時刻の更新)のためのものです。

onRestartはonStopなしで呼び出せますか?

いいえ、できません。onRestartはonStopと対になるメソッドです:onRestartは、ActivityがonStopを通過した後にのみ呼び出されます。ActivityがonStopに入らなかった場合(例:ダイアログボックスが開かれた)、復帰時にonRestartは呼び出されず、onResumeのみが呼び出されます。

エミュレーターでonRestartをシミュレートするには?

エミュレーターでHome(ホームボタン)を押します — Activityが最小化され、onStopを受け取ります。次に、最近のアプリまたはランチャーからアプリを開きます — ActivityはonRestart → onStart → onResumeを受け取ります。デバッグには、onRestartにブレークポイントを設定したDebug、またはActivityタグ付きのLog.dを使用します。

onRestartで例外がスローされるとどうなりますか?

onRestartでのキャッチされない例外はForce Closeを引き起こします。システムはライフサイクルコールバックの例外をキャッチしません。onRestartで例外をスローする可能性のある操作(try-catchなしのネットワークリクエスト、nullのViewの操作)を実行する場合は、try-catchでラップしてください。

onRestartでisFinishing()を確認する必要がありますか?

いいえ。onRestartは、Stopped状態から戻ってくる生存しているActivityに対してのみ呼び出されます。onRestartでのisFinishing()は常にfalseになります。isFinishing()の確認は、onPause(データ保存)とonDestroy(再作成と終了の区別)で意味があります。

まとめ

  • onRestart — ActivityがStopped状態から戻るときに、onStartとonResumeの前に呼び出されるライフサイクルメソッドです。
  • onRestartは、Activityが最初に作成されたときには呼び出されません — 完全に非表示にされた後に再表示されたときにのみ呼び出されます。
  • onRestartの主な目的は、古いデータを更新し、状態(トークン、ネットワーク、設定)を確認することです。
  • onRestartはプロセス終了時には呼び出されません — プロセス終了後の復元にはBundleを使用したonCreateを使用してください。
  • onRestartでonCreateのロジックを複製しないでください:初期化はonCreateで、更新はonRestartで行います。
  • Fragmentの場合、onRestartをオーバーライドする代わりに、viewLifecycleOwnerでLifecycleObserverを使用します。
  • onRestartの適切な実装は、マルチタスク時のUXを向上させ、古いデータの表示を防ぎます。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください