Warm-up und Prefetch: mit dem Service für benutzerdefinierte Tabs

Im dritten Teil dieses Leitfadens geht es um den Dienst für benutzerdefinierte Tabs und darum, warum er in Ihrer Anwendung zu einer besseren Nutzererfahrung führt:

  • Externes Content sofort öffnen:Mit warmup() wird der Browserprozess im Hintergrund gestartet, noch bevor der Nutzer auf einen Link klickt. Beim Öffnen eines Links können bis zu 700 ms eingespart werden. Mit mayLaunchUrl() werden Seiten vorab abgerufen. Wenn beide APIs zusammen verwendet werden, können Seiten sofort geladen werden, was die Nutzererfahrung mit der Integration von benutzerdefinierten Tabs erheblich verbessert.
  • Bessere Handhabung minimierter benutzerdefinierter Tabs: Wenn Sie eine Verbindung zum Dienst für benutzerdefinierte Tabs herstellen und beim Starten des benutzerdefinierten Tabs denselben CustomTabSession verwenden, kann Chrome zuvor minimierte benutzerdefinierte Tabs entfernen, bevor ein neuer Tab eingeführt wird. So ist die Nutzung einheitlicher.

Erforderliche Schritte:

  1. Prüfen Sie mit CustomTabsClient.getPackageName(...), ob der Standardbrowser benutzerdefinierte Tabs unterstützt. Falls ja, binden Sie mithilfe von CustomTabsClient.bindCustomTabsService() an CustomTabsService.
  2. Sobald Sie eine Verbindung zu CustomTabsService hergestellt haben, gehen Sie im CustomTabsServiceConnection.onCustomTabsServiceConnected()-Callback so vor:

    a. Starten Sie den Browserprozess mit CustomTabsClient.warmup() aufwärmen. b. Erstellen Sie mit CustomTabsClient.newSession() ein neues CustomTabsSession.

  3. Optional können Sie mit CustomTabsSession.mayLaunchUrl() vorab Webseiten abrufen, die der Nutzer wahrscheinlich besuchen wird.

  4. Wenn Sie einen neuen benutzerdefinierten Tab starten, übergeben Sie CustomTabsSession mithilfe des Konstruktors new CustomTabsIntent.Builder(session) an CustomTabsIntent.Builder.

Wenn deine App auf Android API-Level 30 ausgerichtet ist, musst du in CustomTabsClient.getPackageName(...) deinem Android-Manifest einen Abfrageabschnitt hinzufügen, in dem ein Intent-Filter deklariert wird, der mit Browsern übereinstimmt, die benutzerdefinierte Tabs unterstützen.

<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>

Hier ist ein vollständiges Beispiel für das Herstellen einer Verbindung zu einem Dienst für benutzerdefinierte 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));
        }
    });
}

Unter Android können URLs von Android-Apps verarbeitet werden. Wenn Nutzende beispielsweise die Facebook-App installiert haben und auf einen Link zu einem Facebook-Beitrag klicken, sollte der Link normalerweise in der Facebook-App und nicht im Browser geöffnet werden.

Wenn benutzerdefinierte Tabs installiert sind, werden standardmäßig Links in der entsprechenden Android-App geöffnet. Sobald jedoch ein CustomTabsServiceConnection eingerichtet wurde, funktioniert dieses Verhalten nicht mehr und alle URLs werden stattdessen in benutzerdefinierten Tabs geöffnet. Wir empfehlen, dieses Verhalten mit dem folgenden Code wieder zu aktivieren, um die Nutzererfahrung zu verbessern:

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

Als Nächstes erfahren Sie, wie Sie die Größe der benutzerdefinierten Tabs anpassen.