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: 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() wstępnie pobiera strony. Korzystanie z obu interfejsów API umożliwia natychmiastowe ładowanie stron, co znacznie usprawnia integrację 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ązaj się z CustomTabsService za pomocą CustomTabsClient.bindCustomTabsService().
  2. Po połączeniu z CustomTabsService w zgłoszeniu zwrotnym CustomTabsServiceConnection.onCustomTabsServiceConnected():

    a. Rozgrzej proces przeglądarki, używając narzędzia 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 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 są obsługiwane przez aplikacje na ten system. 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 zainstalowana. Gdy jednak utworzysz CustomTabsServiceConnection, ta funkcja przestanie działać, a 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.