Przygotowanie i pobieranie z wyprzedzeniem: usługa kart niestandardowych

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

  • 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 wartości 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 zgłoszeniu zwrotnym 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 odwiedzi, 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 w 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ć, a wszystkie adresy URL będą się otwierać w kartach niestandardowych. Aby zapewnić użytkownikom lepsze wrażenia, 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.