Przygotowanie i pobieranie z wyprzedzeniem: usługa kart niestandardowych

Trzecia część tego przewodnika dotyczy przyspieszenia uruchamiania przeglądarki za pomocą warmup() i pobierania stron internetowych z wyprzedzeniem za pomocą metody mayLaunchUrl(). Rozgrzewanie procesu przeglądarki może zaoszczędzić nawet 700 ms podczas otwierania linku. Wstępne renderowanie treści przy użyciu mayLaunchUrl sprawia, że treści zewnętrzne natychmiast się wyświetlają. Zdecydowanie zalecamy stosowanie tych interfejsów API, które mogą znacznie poprawić wygodę użytkowników korzystających z integracji kart niestandardowych.

Wymagane kroki:

  1. Sprawdź, używając CustomTabsClient.getPackageName(...), czy domyślna przeglądarka obsługuje karty niestandardowe. Jeśli tak, powiąż usługę CustomTabsService za pomocą CustomTabsClient.bindCustomTabsService().
  2. Po nawiązaniu połączenia z usługą CustomTabsService w wywołaniu zwrotnym CustomTabsServiceConnection.onCustomTabsServiceConnected() wykonaj te czynności:

    a. Rozgrzej proces przeglądarki za pomocą narzędzia CustomTabsClient.warmup(). b. Utwórz nowy element CustomTabsSession w: CustomTabsClient.newSession().

  3. Opcjonalnie pobierz z wyprzedzeniem strony internetowe, które użytkownik prawdopodobnie odwiedzi za pomocą CustomTabsSession.mayLaunchUrl().

  4. Gdy uruchamiasz nową kartę niestandardową, przekaż CustomTabsSession do klasy CustomTabsIntent.Builder za pomocą konstruktora new CustomTabsIntent.Builder(session).

Jeśli Twoja aplikacja jest kierowana na poziom interfejsu API Androida 30, CustomTabsClient.getPackageName(...) wymaga dodania sekcji zapytań do pliku manifestu Androida i zadeklarowania filtra intencji, który pasuje do przeglądarek obsługujących karty niestandardowe.

<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ą kart niestandardowych:

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

Otwieranie stron w aplikacjach natywnych

Na urządzeniach z Androidem adresy URL mogą być obsługiwane przez aplikacje natywne. Jeśli na przykład użytkownik ma zainstalowaną aplikację Facebook i klika link do posta na Facebooku, zazwyczaj woli, aby link otwierał się w aplikacji Facebook, a nie w przeglądarce.

Domyślnie karty niestandardowe otwierają linki w odpowiednich aplikacjach natywnych, jeśli są one zainstalowane. Jednak po ustawieniu parametru CustomTabsServiceConnection to zachowanie przestaje działać, a wszystkie adresy URL otwierają się na kartach niestandardowych. Aby zadbać o wygodę użytkowników, zalecamy ponowne włączenie tego działania przy użyciu tego kodu:

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

Następny artykuł: dowiedz się, jak zmieniać rozmiar kart niestandardowych.