Przygotowanie i pobieranie z wyprzedzeniem: usługa kart niestandardowych

Trzecia część tego przewodnika dotyczy usługi kart niestandardowych i wyjaśnia, dlaczego korzystanie z niej w aplikacji poprawia wygodę użytkowników:

  • Natychmiastowe otwieranie treści zewnętrznych: korzystanie z warmup() powoduje rozpoczęcie procesu przeglądarki w tle, jeszcze zanim użytkownik kliknie link. Może to zaoszczędzić nawet 700 ms podczas otwierania linku. mayLaunchUrl() pobiera strony z wyprzedzeniem. Połączenie obu interfejsów API umożliwia natychmiastowe wczytywanie stron, co znacznie zwiększa wygodę użytkowników korzystających z integracji kart niestandardowych.
  • Lepsza obsługa zminimalizowanych kart niestandardowych: dzięki połączeniu z usługą Karty niestandardowe i użyciu tego samego CustomTabSession podczas uruchamiania karty niestandardowej Chrome będzie w stanie usunąć wcześniej zminimalizowane karty niestandardowe przed uruchomieniem nowej karty. W ten sposób zadbasz o wygodę użytkowników.

Wymagane kroki:

  1. Za pomocą CustomTabsClient.getPackageName(...) sprawdź, 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ą funkcji CustomTabsClient.warmup(). b. Utwórz nowy element CustomTabsSession przy użyciu 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));
        }
    });
}

W systemie Android adresy URL mogą być obsługiwane przez aplikacje na Androida. 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 na Androida (jeśli są 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.