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

Im dritten Teil dieses Leitfadens geht es um den Service für benutzerdefinierte Tabs und darum, warum die Verwendung in Ihrer Anwendung für eine bessere Nutzererfahrung sorgt:

  • Externe Inhalte sofort öffnen:Wenn Sie warmup() verwenden, startet der Browserprozess im Hintergrund, noch bevor der Nutzer auf einen Link klickt. Beim Öffnen eines Links können die Zeit bis zu 700 ms eingespart werden. mayLaunchUrl() ruft Seiten vorab ab. Durch die gemeinsame Verwendung beider APIs können Seiten sofort geladen werden, was die Nutzererfahrung durch die 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 dasselbe CustomTabSession verwenden, kann Chrome einen zuvor minimierten benutzerdefinierten Tab entfernen, bevor ein neuer Tab eingeführt wird. Dadurch wird die Nutzung einheitlicher.

Dazu sind folgende Schritte erforderlich:

  1. Prüfen Sie mit CustomTabsClient.getPackageName(...), ob der Standardbrowser benutzerdefinierte Tabs unterstützt. Falls ja, erstellen Sie mithilfe von CustomTabsClient.bindCustomTabsService() eine Bindung an den CustomTabsService.
  2. Nachdem Sie eine Verbindung mit dem CustomTabsService hergestellt haben, führen Sie im CustomTabsServiceConnection.onCustomTabsServiceConnected()-Callback folgende Schritte aus:

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

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

  4. Übergeben Sie beim Starten eines neuen benutzerdefinierten Tabs CustomTabsSession mithilfe des Konstruktors new CustomTabsIntent.Builder(session) an den CustomTabsIntent.Builder.

Wenn Ihre App auf Android API-Level 30 ausgerichtet ist, müssen Sie Ihrem Android-Manifest für CustomTabsClient.getPackageName(...) einen Abfragebereich hinzufügen, in dem Sie einen Intent-Filter deklarieren, der Browsern entspricht, 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, wie Sie eine Verbindung zu einem Dienst für benutzerdefinierte Tabs herstellen:

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 der Nutzer beispielsweise die Facebook-App installiert hat und auf einen Link zu einem Facebook-Beitrag klickt, wird der Link normalerweise in der Facebook-App und nicht im Browser geöffnet.

Bei benutzerdefinierten Tabs werden Links standardmäßig in der jeweiligen Android-App geöffnet, sofern sie installiert sind. Sobald jedoch ein CustomTabsServiceConnection eingerichtet wurde, funktioniert dieses Verhalten nicht mehr und alle URLs werden stattdessen in benutzerdefinierten Tabs geöffnet. Zur Verbesserung der Nutzerfreundlichkeit empfehlen wir, dieses Verhalten mit dem folgenden Code wieder zu aktivieren:

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

Nächster Schritt: Informationen zum Ändern der Größe von benutzerdefinierten Tabs