ウォームアップとプリフェッチ: カスタムタブ サービスの使用

このガイドの第 3 部では、カスタムタブ サービスと、アプリでカスタムタブ サービスを使用することでユーザー エクスペリエンスが向上する理由について説明します。

  • 外部コンテンツを即座に開く: warmup() を使用すると、ユーザーがリンクをクリックする前にブラウザ プロセスがバックグラウンドで開始されるため、リンクを開く時間を最大で 700 ミリ秒短縮できます。mayLaunchUrl() ページをプリフェッチします。両方の API を併用すると、ページを即座に読み込むことができるため、カスタム タブの統合によるユーザー エクスペリエンスが大幅に向上します。
  • 最小化されたカスタムタブの処理を改善: カスタムタブ サービスに接続し、カスタムタブの起動時に同じ CustomTabSession を使用すると、Chrome は新しいタブを起動する前に、以前に最小化されたカスタムタブを削除できるようになります。これにより、より一貫したユーザー エクスペリエンスを提供できます。

必要な手順は次のとおりです。

  1. CustomTabsClient.getPackageName(...) を使用して、デフォルトのブラウザがカスタムタブをサポートしているかどうかを確認します。「はい」の場合は、CustomTabsClient.bindCustomTabsService() を使用して CustomTabsService にバインドします。
  2. CustomTabsService に接続したら、CustomTabsServiceConnection.onCustomTabsServiceConnected() コールバックで次の操作を行います。

    a. CustomTabsClient.warmup() を使用してブラウザ プロセスをウォームアップします。b. CustomTabsClient.newSession() を使用して新しい CustomTabsSession を作成します。

  3. 必要に応じて、CustomTabsSession.mayLaunchUrl() を使用して、ユーザーがアクセスする可能性が高いウェブページをプリフェッチします。

  4. 新しいカスタムタブを起動するときは、コンストラクタ new CustomTabsIntent.Builder(session) を使用して CustomTabsSessionCustomTabsIntent.Builder に渡します。

アプリが Android API レベル 30 をターゲットとしている場合、CustomTabsClient.getPackageName(...) では、Android マニフェストにクエリ セクションを追加し、カスタムタブをサポートするブラウザに一致するインテント フィルタを宣言する必要があります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
  …
   <queries>
        <intent>
            <action android:name="android.support.customtabs.action.CustomTabsService" />
        </intent>
    </queries>
</manifest>

カスタムタブ サービスに接続する方法の完全な例を次に示します。

private CustomTabsClient mClient;
private CustomTabsSession mSession;

private CustomTabsServiceConnection mConnection = new CustomTabsServiceConnection() {
    @Override
    public void onCustomTabsServiceConnected(
            @NonNull ComponentName name,
            @NonNull CustomTabsClient client
    ) {
        mClient = client;
        // Warm up the browser process
        mClient.warmup(0 /* placeholder for future use */);
        // Create a new browser session
        mSession = mClient.newSession(new CustomTabsCallback());
        // Pre-render pages the user is likely to visit
        // you can do this any time while the service is connected
        mSession.mayLaunchUrl(Uri.parse("https://developers.android.com"), null, null);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mClient = null;
        mSession = null;
    }
};

private void bindCustomTabService(Context context) {
    // Check for an existing connection
    if (mClient != null) {
        // Do nothing if there is an existing service connection
        return;
    }

    // Get the default browser package name, this will be null if
    // the default browser does not provide a CustomTabsService
    String packageName = CustomTabsClient.getPackageName(context, null);
    if (packageName == null) {
        // Do nothing as service connection is not supported
        return;
    }
    CustomTabsClient.bindCustomTabsService(context, packageName, mConnection);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
…
    bindCustomTabService(this);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String url = "https://developers.android.com";
            CustomTabsIntent intent = new CustomTabsIntent.Builder(mSession)
                    .build();
            intent.launchUrl(MainActivity.this, Uri.parse(url));
        }
    });
}

Android では、URL は Android アプリで処理できます。たとえば、ユーザーが Facebook アプリをインストールしていて、Facebook 投稿へのリンクをクリックした場合、通常はブラウザではなく Facebook アプリでリンクを開くことを希望します。

デフォルトでは、対応する Android アプリがインストールされている場合、そのアプリでカスタムタブでリンクが開きます。ただし、CustomTabsServiceConnection が確立されると、この動作は停止し、すべての URL がカスタムタブで開かれるようになります。ユーザー エクスペリエンスを向上させるため、次のコードを使用してこの動作を再度有効にすることをおすすめします。

CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder()
    .setSendToExternalDefaultHandlerEnabled(true)
    .build();

次は、カスタムタブのエクスペリエンスのサイズを変更する方法について説明します。