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

Im dritten Teil dieses Leitfadens geht es um den Custom Tabs-Dienst und warum er in Ihrer App für eine bessere Nutzererfahrung sorgt:

  • Externe Inhalte sofort öffnen:Wenn Sie warmup() verwenden, wird der Browserprozess im Hintergrund gestartet, noch bevor der Nutzer auf einen Link klickt. So können beim Öffnen eines Links bis zu 700 ms gespart werden. mayLaunchUrl() lädt Seiten vorab. Wenn Sie beide APIs verwenden, können Seiten sofort geladen werden, was die Nutzerfreundlichkeit der Integration von benutzerdefinierten Tabs erheblich verbessert.
  • Verbesserte Handhabung minimierter benutzerdefinierter Tabs: Wenn eine Verbindung zum Custom Tabs-Dienst hergestellt und beim Starten des benutzerdefinierten Tabs dieselbe CustomTabSession verwendet wird, kann Chrome einen zuvor minimierten benutzerdefinierten Tab entfernen, bevor ein neuer Tab geöffnet wird. So wird die Nutzerfreundlichkeit verbessert.

Führen Sie dazu die folgenden Schritte aus:

  1. Prüfen Sie mit CustomTabsClient.getPackageName(...), ob der Standardbrowser benutzerdefinierte Tabs unterstützt. Falls ja, binden Sie mit CustomTabsClient.bindCustomTabsService() an den CustomTabsService an.
  2. Nachdem Sie eine Verbindung zum CustomTabsService hergestellt haben, führen Sie im Rückruf CustomTabsServiceConnection.onCustomTabsServiceConnected() Folgendes aus:

    a. Warm-up des Browserprozesses mit CustomTabsClient.warmup() b. Erstellen Sie mit CustomTabsClient.newSession() eine neue CustomTabsSession.

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

  4. Wenn Sie einen neuen benutzerdefinierten Tab starten, übergeben Sie die CustomTabsSession über den Konstruktor new CustomTabsIntent.Builder(session) an den CustomTabsIntent.Builder.

Wenn Ihre App auf die Android API-Ebene 30 ausgerichtet ist, müssen Sie Ihrem Android-Manifest gemäß CustomTabsClient.getPackageName(...) einen Abschnitt für Abfragen hinzufügen und einen Intent-Filter deklarieren, der Browser mit Unterstützung für benutzerdefinierte Tabs abgleicht.

<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 ein vollständiges Beispiel für die Verbindung zu einem Custom Tabs-Dienst:

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

Standardmäßig werden Links in Custom Tabs in der entsprechenden Android-App geöffnet, sofern diese installiert ist. Sobald jedoch ein CustomTabsServiceConnection eingerichtet wurde, funktioniert dieses Verhalten nicht mehr und alle URLs werden stattdessen in benutzerdefinierten Tabs geöffnet. Für eine bessere Nutzerfreundlichkeit empfehlen wir, dieses Verhalten mit dem folgenden Code wieder zu aktivieren:

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

Nächster Schritt: Größe von benutzerdefinierten Tabs ändern