Przygotowanie i pobieranie z wyprzedzeniem: usługa kart niestandardowych

Trzecia część tego przewodnika dotyczy usługi kart niestandardowych i dlaczego używanie jej w aplikacji poprawia wygodę użytkowników:

  • Natychmiastowe otwieranie treści zewnętrznych: użycie warmup() powoduje rozpoczęcie procesu przeglądarki w tle, jeszcze zanim użytkownik kliknie link, i może zaoszczędzić do 700 ms po otwarciu linku. mayLaunchUrl() pobiera strony z wyprzedzeniem. Jednoczesne korzystanie z obu interfejsów API umożliwia natychmiastowe ładowanie stron, co znacznie usprawnia integrację z kartami niestandardowymi.
  • Lepsza obsługa zminimalizowanych kart niestandardowych: jeśli połączysz się z usługą Karty niestandardowe i włączysz ten sam element CustomTabSession podczas uruchamiania karty niestandardowej, Chrome będzie mieć możliwość usunięcia wcześniej zminimalizowanych kart przed otwarciem nowej, co zapewni użytkownikom bardziej spójne wrażenia.

Wymagane kroki:

  1. Sprawdź, czy domyślna przeglądarka obsługuje karty niestandardowe za pomocą funkcji CustomTabsClient.getPackageName(...). Jeśli tak, utwórz powiązanie z usługą CustomTabsService za pomocą CustomTabsClient.bindCustomTabsService().
  2. Po połączeniu się z usługą CustomTabsService w wywołaniu zwrotnym CustomTabsServiceConnection.onCustomTabsServiceConnected() wykonaj te czynności:

    a. Rozgrzej proces przeglądarki, używając narzędzia CustomTabsClient.warmup(). b. Utwórz nowy element CustomTabsSession przy użyciu adresu e-mail CustomTabsClient.newSession().

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

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

Jeśli Twoja aplikacja jest kierowana na interfejs API Androida na poziomie 30, CustomTabsClient.getPackageName(...) wymaga dodania sekcji zapytań do pliku manifestu Androida, zadeklarowania filtra intencji, który pasuje do przeglądarek i obsługuje 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 łą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));
        }
    });
}

Na Androidzie adresy URL są obsługiwane przez aplikacje na ten system. Jeśli na przykład użytkownik ma zainstalowaną aplikację Facebook i klika link do posta na Facebooku, zwykle woli otworzyć link w aplikacji Facebook zamiast w przeglądarce.

Domyślnie karty niestandardowe otwierają linki w odpowiednich aplikacjach na Androida, jeśli są zainstalowane. Jednak po utworzeniu CustomTabsServiceConnection ten sposób działania przestanie działać i wszystkie adresy URL będą otwierać się na kartach niestandardowych. Dla wygody użytkowników zalecamy ponowne włączenie tego działania za pomocą tego kodu:

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

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