Przygotowanie i pobieranie z wyprzedzeniem: usługa kart niestandardowych

Trzecia część tego przewodnika dotyczy usługi kart niestandardowych i wyjaśnia, dlaczego jej użycie w aplikacji zapewnia lepsze wrażenia użytkownikom:

  • Natychmiastowe otwieranie treści zewnętrznych: funkcja warmup() powoduje, że proces przeglądarki uruchamia się w tle jeszcze przed kliknięciem linku przez użytkownika. Pozwala to zaoszczędzić nawet 700 ms podczas otwierania linku. mayLaunchUrl() wstępnie wczytuje strony. Korzystanie z obu interfejsów API pozwala na natychmiastowe wczytywanie stron, co znacznie poprawia wrażenia użytkowników korzystających z integracji z kartami niestandardowymi.
  • Lepsze obsługiwanie zminimalizowanych kart niestandardowych: po połączeniu z usługą kart niestandardowych i użyciu tej samej CustomTabSession podczas uruchamiania karty niestandardowej Chrome będzie mógł usunąć wcześniej zminimalizowaną kartę niestandardową przed uruchomieniem nowej karty, co zapewni użytkownikom bardziej spójne wrażenia.

Wymagane działania:

  1. Sprawdź, czy przeglądarka domyślna obsługuje karty niestandardowe (CustomTabsClient.getPackageName(...)). Jeśli tak, powiązać z CustomTabsService za pomocą CustomTabsClient.bindCustomTabsService().
  2. Po połączeniu z CustomTabsService w zwrotce CustomTabsServiceConnection.onCustomTabsServiceConnected():

    a. Rozgrzej proces przeglądarki za pomocą CustomTabsClient.warmup(). b. Utwórz nowy CustomTabsSession za pomocą CustomTabsClient.newSession().

  3. Opcjonalnie możesz pobrać z wyprzedzeniem strony internetowe, które użytkownik prawdopodobnie otworzy, korzystając z CustomTabsSession.mayLaunchUrl().

  4. Podczas uruchamiania nowej karty niestandardowej prześlij parametr CustomTabsSession do klasy CustomTabsIntent.Builder za pomocą konstruktora new CustomTabsIntent.Builder(session).

Jeśli Twoja aplikacja jest kierowana na Androida na poziomie interfejsu API 30, CustomTabsClient.getPackageName(...) wymaga dodania do pliku manifestu na Androida sekcji zapytań, w której należy zadeklarować filtr intencji pasujący do przeglądarek z obsługą kart niestandardowych.

<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>

Oto pełny przykład połączenia z usługą Custom Tabs:

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));
        }
    });
}

Na Androidzie adresy URL mogą być obsługiwane przez aplikacje na Androida. Jeśli na przykład użytkownik ma zainstalowaną aplikację Facebook i kliknie link do posta na Facebooku, prawdopodobnie woli, aby link otworzył się w aplikacji Facebook, a nie w przeglądarce.

Domyślnie karty niestandardowe otwierają linki w odpowiedniej aplikacji na Androida, jeśli jest ona zainstalowana. Gdy jednak utworzysz CustomTabsServiceConnection, ta funkcja przestanie działać i wszystkie adresy URL będą się otwierać w kartach niestandardowych. Aby zapewnić lepsze wrażenia użytkownika, zalecamy ponowne włączenie tego zachowania za pomocą tego kodu:

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

Dalej: dowiedz się, jak zmieniać rozmiar kart niestandardowych.