予測型「戻る」ジェスチャーのサポートを追加する

図 1. スマートフォンでの予測型「戻る」ジェスチャーのデザインを示すモックアップ

予測型「戻る」は、ジェスチャー ナビゲーション機能で、ユーザーが「戻る」スワイプで移動する先をプレビューできます。

たとえば図 1 のモックアップに示すように、「戻る」ジェスチャーによって、アプリの背後にあるホーム画面のアニメーション プレビューを表示できます。

Android 15 以降では、予測型「戻る」アニメーションのデベロッパー オプションは利用できなくなります。「ホームに戻る」、タスク間、アクティビティ間などのシステム アニメーションが、予測型「戻る」ジェスチャーを完全に、またはアクティビティ レベルでオプトインしたアプリに表示されるようになりました。

このホームに戻るアニメーションをテストできます(このページの次のセクションを参照)。

予測型「戻る」ジェスチャーをサポートするには、下位互換性がある OnBackPressedCallback AppCompat 1.6.0-alpha05(AndroidX)以上の API、または新しい OnBackInvokedCallback プラットフォーム API を使用して、アプリを更新する必要があります。ほとんどのアプリでは、下位互換性のある AndroidX API を使用します。

この更新は、「戻る」ナビゲーションを正しくインターセプトするための移行パスを提供するもので、KeyEvent.KEYCODE_BACK からの「戻る」インターセプトや、onBackPressed メソッドを含むクラス(ActivityDialog など)を、新しいシステムの「戻る」API で置き換えるためのものです。

Codelab と Google I/O の動画

ドキュメントのこのページの内容に加えて、Codelab もお試しください。AndroidX のアクティビティ API を使用して予測型「戻る」ジェスチャーを処理する WebView の一般的なユースケース実装を参照できます。

AndroidX とプラットフォームの API を実装する例については、Google I/O の動画もご覧ください。

Compose でカスタムの「戻る」ジェスチャーを処理する

Compose には、カスタムの戻るジェスチャーを処理するための PredictiveBackHandler コンポーザブルが用意されています。この API を使用すると、戻るジェスチャーに応答できます。また、ユーザーがスワイプしたときにカスタム アニメーションやトランジションを実装するために使用できる BackEventCompat オブジェクトの Flow を提供します。

PredictiveBackHandler(enabled = isBackHandlerEnabled) { progress: Flow<BackEventCompat> ->
    try {
        progress.collect { backEvent ->
            // Update your UI or animation based on backEvent.progress
        }
        // Handle the final back action (e.g., navigate back)
    } catch (e: CancellationException) {
        // Back gesture was cancelled, reset your UI
    }
}

進行状況をトラッキングせずに戻るジェスチャーをインターセプトするだけでよい場合は、BackHandler を使用します。

デフォルトの「戻る」ナビゲーションを使用するアプリを更新する

予測型「戻る」はデフォルトで有効になっています。

アプリでフラグメントや Navigation コンポーネントを使用している場合は、AndroidX Activity 1.6.0-alpha05 以降へのアップグレードも行ってください。

カスタムの「戻る」ナビゲーションを使用するアプリを更新する

アプリにカスタム「戻る」動作が実装されている場合は、AndroidX 使用の有無や「戻る」ナビゲーションの処理方法に応じて移行パスが異なります。

アプリでの「戻る」ナビゲーションの処理方法 おすすめの移行パス(このページのリンク)
AndroidX API AndroidX の既存の「戻る」動作を移行する
サポートされていないプラットフォーム API サポート対象外の「戻る」ナビゲーション API を含む AndroidX アプリを AndroidX API に移行する

AndroidX の「戻る」ナビゲーションの実装を移行する

このユースケースが最も一般的なおすすめの方法です。これは、OnBackPressedDispatcher によってカスタム ジェスチャー ナビゲーションを処理する、新規と既存両方のアプリに当てはまります(適切な「戻る」ナビゲーションを提供するを参照)。

すでに OnBackPressedDispatcher を使用している API(フラグメントや Navigation コンポーネントなど)が、予測型「戻る」ジェスチャーとシームレスに連携するように、AndroidX Activity 1.6.0-alpha05 にアップグレードします。

```xml
// In your build.gradle file:
dependencies {

// Add this in addition to your other dependencies
implementation "androidx.activity:activity:1.6.0-alpha05"
```

サポート対象外の「戻る」ナビゲーション API を含む AndroidX アプリを AndroidX API に移行する

アプリで AndroidX ライブラリを使用しながら、サポートされていない「戻る」ナビゲーション API を実装または参照している場合は、AndroidX API に移行して新しい動作をサポートする必要があります。

サポートされていない API を AndroidX API に移行する手順は次のとおりです。

  1. OnBackPressedCallback の実装を使用して、システムの「戻る」ナビゲーション処理ロジックを AndroidX の OnBackPressedDispatcher に移行します。詳細なガイダンスについては、適切な「戻る」ナビゲーションを提供するをご覧ください。

  2. 「戻る」ジェスチャーのインターセプトを停止する準備ができたら、OnBackPressedCallback を無効にします。

  3. OnBackPressed または KeyEvent.KEYCODE_BACK による「戻る」イベントのインターセプトを停止します。

  4. 必ず AndroidX Activity 1.6.0-alpha05 にアップグレードしてください。

    // In your build.gradle file:
    dependencies {
    
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0-alpha05"
    

予測型「戻る」をオプトアウトする

オプトアウトするには、AndroidManifest.xml<application> タグ内で、android:enableOnBackInvokedCallback フラグを false に設定します。

<application
    ...
    android:enableOnBackInvokedCallback="false"
    ... >
...
</application>

これを false に設定すると、次のようになります。

  • 予測型「戻る」ジェスチャーのシステム アニメーションが無効になります。
  • OnBackInvokedCallback は無視されますが、OnBackPressedCallback 呼び出しは引き続き機能します。

アクティビティ レベルでオプトアウトする

android:enableOnBackInvokedCallback フラグを使用すると、アクティビティ レベルで予測型システム アニメーションを無効にできます。この動作により、大規模なマルチアクティビティ アプリを予測型「戻る」ジェスチャーに移行しやすくなります。

次のコードは、enableOnBackInvokedCallback を設定して MainActivity からホームに戻るシステム アニメーションを有効にする例を示しています。

<manifest ...>
    <application . . .

        android:enableOnBackInvokedCallback="false">

        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...
        </activity>
        <activity
            android:name=".SecondActivity"
            android:enableOnBackInvokedCallback="false"
            ...
        </activity>
    </application>
</manifest>

android:enableOnBackInvokedCallback フラグを使用する場合は、次の点にご注意ください。

  • android:enableOnBackInvokedCallback=false と設定すると、タグを設定した場所に応じて、アクティビティ レベルまたはアプリレベルで予測型「戻る」アニメーションがオフになります。また、システムに対して、OnBackInvokedCallback プラットフォーム API の呼び出しを無視するよう指示します。ただし、OnBackPressedCallback には下位互換性があり、Android 13 より前でサポートされていない onBackPressed API が呼び出されるため、OnBackPressedCallback の呼び出しは引き続き実行されます。
  • アプリレベルで enableOnBackInvokedCallback フラグを設定すると、アプリ内のすべてのアクティビティのデフォルト値が設定されます。アクティビティごとにデフォルトをオーバーライドするには、上記のコード例に示すように、アクティビティ レベルでフラグを設定します。

コールバックに関するベスト プラクティス

サポートされているシステムの「戻る」コールバック(PredictiveBackHandler または BackHandler(Compose の場合)、OnBackPressedCallbackOnBackInvokedCallback)の使用に関するベスト プラクティスは次のとおりです。

各コールバックを有効または無効にする UI 状態を特定する

UI 状態は、UI を表すプロパティです。この手順の概要に沿って行うことをおすすめします。

  1. 各コールバックを有効または無効にする UI 状態を特定します。

  2. 観測可能なデータホルダーの型StateFlow や Compose の状態など)を使用してその状態を定義し、状態が変化したときにコールバックを有効または無効にします。

アプリで以前に「戻る」ロジックを条件ステートメントと関連付けていた場合、「戻る」イベントがすでに発生した後で対応している可能性があります。新しいコールバックでは、このパターンを避けてください。可能であれば、コールバックを条件ステートメントの外側に移動して、代わりにコールバックを観測可能なデータホルダーの型に関連付けます。

UI ロジックにシステムの「戻る」コールバックを使用する

UI ロジックは、UI の表示方法を決定します。システムの「戻る」コールバックを使用して、ダイアログの表示やアニメーションの実行などの UI ロジックを実行します。

アプリが PRIORITY_DEFAULT または PRIORITY_OVERLAY を使用して OnBackPressedCallback または OnBackInvokedCallback を有効にしている場合、予測型の「戻る」アニメーションは実行されず、「戻る」イベントを処理する必要があります。ビジネス ロジックの実行やロギングのためにこれらのコールバックを作成しないでください。

ユーザーがスワイプして戻ったときにアプリでビジネス ロジックを実行したり、ログを記録したりする必要がある場合は、次のアプローチを使用します。

  • Android 16 以降を搭載しているデバイスでは、PRIORITY_SYSTEM_NAVIGATION_OBSERVER とともに OnBackInvokedCallback を使用します。これにより、戻るイベントを消費しないオブザーバー コールバックが作成されます。たとえば、ユーザーがルート アクティビティからスワイプして戻ったとき、つまりユーザーがアプリを離れたときに、このコールバックを登録できます。この場合、戻るイベントをログに記録したり、他のビジネス ロジックを実行したりできますが、ホームに戻るアニメーションは引き続き再生されます。
  • アクティビティからアクティビティへのケース、またはフラグメントからアクティビティへのケースに関しては、アクティビティのライフサイクル内で onDestroy 内の isFinishingtrue である場合にログを記録します。
  • フラグメントからフラグメントへのケースに関しては、フラグメントのビュー ライフサイクル内で onDestroy 内の isRemoving が true の場合にログを記録します。または、FragmentManager.OnBackStackChangedListener 内で onBackStackChangeStarted メソッドか onBackStackChangeCommitted メソッドを使用してログを記録します。
  • Compose の場合、Compose のデスティネーションに関連付けられた ViewModelonCleared() コールバック内でログに記録します。これは、Compose のデスティネーションがバックスタックからポップされて破棄されたことを知るための最適なシグナルです。

役割が 1 つのみのコールバックを作成する

ディスパッチャには複数のコールバックを追加できます。コールバックはスタックに追加され、最後に追加された有効なコールバックが、「戻る」操作ごとに 1 つのコールバックで次の「戻る」操作を処理します。

コールバックに単一の責任がある場合、コールバックの有効状態を管理しやすくなります。次に例を示します。

スタック内のコールバックの順序。
図 2. コールバック スタック図。

図 2 は、スタックに複数のコールバックがあり、それぞれが 1 つの処理を担当している様子を示しています。コールバックは、スタック内のそれより上のコールバックが無効になっている場合にのみ実行されます。この例では、ユーザーがフォームにデータを入力すると「Are you sure...」コールバックが有効になり、それ以外の場合は無効になります。ユーザーがフォームを終了するためにスワイプして戻ると、コールバックによって確認ダイアログが開きます。

もう一方のコールバックには、予測型「戻る」をサポートするマテリアル コンポーネント、Progress API を使用する AndroidX トランジション、または別のカスタム コールバックを含めることができます。

Compose でも同様のスタック動作が適用され、最も内側の PredictiveBackHandler または BackHandler が優先されます。

同様に、上記のコールバックが無効になっていて、この FragmentManager のバックスタックが空でない場合、childFragmentManager のコールバックが実行されます。この例では、この内部コールバックは無効になっています。

同様に、上記のコールバックが無効で、スタックが空でない場合、supportFragmentManager の内部コールバックが実行されます。この例では、ユーザーがフォームにテキストを入力しなかったため、「Are you sure...」コールバックが無効になった場合に、このコールバックが実行されます。

最後に、上記のコールバックが無効になっている場合、システムは戻るジェスチャーを処理します。「ホームに戻る」、アクティビティ間、タスク間などのシステム アニメーションをトリガーするには、supportFragmentManager のバックスタックが空で、内部コールバックが無効になっている必要があります。

予測型「戻る」ジェスチャーのアニメーションをテストする

Android 13 または Android 14 をまだ使用している場合は、図 1 のようなホームに戻るアニメーションをテストできます。

このアニメーションをテストする手順は次のとおりです。

  1. デバイスで、[設定] > [システム] > [開発者向けオプション] に移動します。

  2. [予測型「戻る」アニメーション] を選択します。

  3. 更新したアプリを起動し、「戻る」ジェスチャーを使用して実際の動作を確認します。