予測型「戻る」ジェスチャーをサポートするようにアプリを更新する

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

Android 13 では、スマートフォン、大画面デバイス、折りたたみ式デバイスなどの Android デバイス用に、予測型「戻る」ジェスチャーが導入されます。この機能が完全に実装されると、ユーザーは「戻る」ジェスチャーを最後まで行う前にその結果のプレビューを確認して、戻るか現在のビューのままにするかを決定できるようになります。

たとえば図 1 のモックアップに示すように、「戻る」ジェスチャーによって、アプリの背後にあるホーム画面のアニメーション プレビューを表示できます。Android 13 の最終リリース以降では、このページに記載されている方法で開発者向けオプションを有効にすると、ホームに戻るアニメーションをテストできます。

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

この更新は、サポートが終了した「戻る」ナビゲーション API のための移行パスになります。これには、KeyEvent.KEYCODE_BACK や、onBackPressed メソッドを含むクラス(ActivityDialog など)が該当します。

Codelab

このページの内容に加えて、Codelab もお試しください。Codelab では、WebView で AndroidX Activity APIs を使用して予測型「戻る」ジェスチャーを処理する、一般的なユースケースを確認できます。

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

この機能をサポートするようにアプリを更新することは、アプリにカスタムの「戻る」動作が実装されていなければ簡単です(「戻る」動作はシステムで処理されます)。このページの説明に沿って、この機能を有効にするだけです。

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

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

アプリで AndroidX を使用している アプリでの「戻る」ナビゲーションの処理方法 おすすめの移行パス(このページのリンク)
AndroidX API AndroidX の既存の「戻る」動作を移行する
サポートされていないプラットフォーム API サポート対象外の「戻る」ナビゲーション API を含む AndroidX アプリを AndroidX API に移行する
× サポートされていないプラットフォーム API(移行可能) サポート対象外の「戻る」ナビゲーション API を使用するアプリをプラットフォーム API に移行する
サポートされていないプラットフォーム API(移行不可) 必須機能になるまでオプトインを延期する

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

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

アプリがこのカテゴリに該当する場合は、このページの説明に沿って予測型「戻る」ジェスチャーをオプトインすることで、予測型「戻る」ジェスチャーをサポートできます。

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

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

サポートされていない API を AndroidX API に移行するには、次の操作を行います。

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

  2. システムの「戻る」ナビゲーションのインターセプトを停止するには、以前に有効にした OnBackPressedCallback のインスタンスを無効にするか、どの時点のコールバックも有効にしないようにします。

  3. アプリを正常に移行したら、このページの説明に沿って、予測型「戻る」ジェスチャーをオプトインします。

サポート対象外の「戻る」ナビゲーション API を使用するアプリをプラットフォーム API に移行する

アプリで AndroidX ライブラリを使用できず、サポートされていない API を使用してカスタム「戻る」ナビゲーションを実装または参照している場合は、OnBackInvokedCallback プラットフォーム API に移行する必要があります。

サポートされていない API をプラットフォーム API に移行するには、次の手順を行います。

  1. Android 13 以上を搭載したデバイスでは新しい OnBackInvokedCallback API を使用し、Android 12 以下を搭載したデバイスではサポートされていない API を使用します。

  2. OnBackInvokedCallback のカスタム「戻る」ロジックを onBackInvoked メソッドのロジックに登録します。それによって現在のアクティビティが終了しなくなり、ユーザーがシステムの「戻る」ナビゲーションを完了した時点で、コールバックが「戻る」アクションに反応できるようになります。

  3. 今後、システムの「戻る」ナビゲーションの機能強化が適切にサポートされるように、アプリでの OnBackInvokedCallback の登録を必ず解除してください。解除しないと、システムの「戻る」ナビゲーションの使用時に、ビュー間で動かなくなってユーザーがアプリを強制終了しなければならなくなるなど、望ましくない動作が発生することがあります。

    onBackPressed からロジックを移行する方法の例を次に示します。

    Kotlin

    @Override
    fun onCreate() {
        if (BuildCompat.isAtLeastT()) {
            onBackInvokedDispatcher.registerOnBackInvokedCallback(
                OnBackInvokedDispatcher.PRIORITY_DEFAULT
            ) {
                /**
                 * onBackPressed logic goes here. For instance:
                 * Prevents closing the app to go home screen when in the
                 * middle of entering data to a form
                 * or from accidentally leaving a fragment with a WebView in it
                 *
                 * Unregistering the callback to stop intercepting the back gesture:
                 * When the user transitions to the topmost screen (activity, fragment)
                 * in the BackStack, unregister the callback by using
                 * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback
                 * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback)
                 */
            }
        }
    }
    

    Java

    @Override
    void onCreate() {
      if (BuildCompat.isAtLeastT()) {
        getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
            OnBackInvokedDispatcher.PRIORITY_DEFAULT,
            () -> {
              /**
               * onBackPressed logic goes here - For instance:
               * Prevents closing the app to go home screen when in the
               * middle of entering data to a form
               * or from accidentally leaving a fragment with a WebView in it
               *
               * Unregistering the callback to stop intercepting the back gesture:
               * When the user transitions to the topmost screen (activity, fragment)
               * in the BackStack, unregister the callback by using
               * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback
               * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback)
               */
            }
        );
      }
    }
    
  4. アプリを正常に移行したら、次のセクションの説明に沿って、予測型「戻る」ジェスチャーをオプトインします。

予測型「戻る」ジェスチャーをオプトインする

実際のケースに基づいてアプリを更新する方法を決定したら、予測型「戻る」ジェスチャーのサポートを簡単にオプトインできます。

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

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

値を指定しない場合は、デフォルトで false に設定され、予測型「戻る」ジェスチャーが無効になります。

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

Android 13 の最終リリース以降では、開発者向けオプションを有効にして、図 1 のようなホームに戻るアニメーションをテストできるようになります。

このアニメーションをテストするには、次の手順を行います。

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

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

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