Nutzerinteraktion messen

In diesem Leitfaden wird erläutert, wie Sie Engagement-Signale für benutzerdefinierte Tabs in Chrome messen. Wenn Ihre App Nutzern regelmäßig Links zu Webinhalten anzeigt, z. B. in einem Nachrichtenfeed, kann es wichtig sein zu wissen, welche Links Nutzer wertvoll finden und welche nicht. Auf benutzerdefinierten Tabs können Sie die sitzungsspezifischen Nutzerinteraktionen anhand der Anzahl der Navigationen, der Änderungen der Scrollrichtung und der Scrolltiefe messen. In der Demo-App für benutzerdefinierte Tabs auf GitHub können Sie sich die Signale zur Interaktion ansehen.

Demo zu Signalen für die Interaktion mit benutzerdefinierten Tabs.

Benutzerdefinierte Tabs bieten zwei verschiedene Callbacks zum Erfassen von Nutzerinteraktionen:

  • CustomTabsCallback zum Erfassen grundlegender Navigationsereignisse wie "NAVIGATION_STARTED" oder "NAVIGATION_FINISHED"
  • EngagementSignalsCallback zum Erfassen von seitenspezifischen Nutzerinteraktionen, z. B. Scrollrichtung oder Scrollprozentsatz.

Für beide ist eine aktive CustomTabsServiceConnection erforderlich. Eine ausführliche Anleitung zum Herstellen einer Verbindung zu einem CustomTabsService findest du im vorherigen CustomTabsService-Leitfaden.

Wenn Sie das Nutzer-Engagement messen möchten, erstellen Sie zuerst eine CustomTabsCallback- und eine EngagementSignalsCallback-Instanz. Der CustomTabsCallback empfängt eine navigationEvent-Konstante, die beschreibt, welche Art der Navigation stattgefunden hat:

private CustomTabsCallback mCustomTabsCallback = new CustomTabsCallback() {
    @Override
    public void onNavigationEvent(int navigationEvent, @Nullable Bundle extras) {
        String event;
        switch (navigationEvent) {
            case CustomTabsCallback.NAVIGATION_ABORTED:
                event = "NAVIGATION_ABORTED";
                break;
            case CustomTabsCallback.NAVIGATION_FAILED:
                event = "NAVIGATION_FAILED";
                break;
            case CustomTabsCallback.NAVIGATION_FINISHED:
                event = "NAVIGATION_FINISHED";
                break;
            case CustomTabsCallback.NAVIGATION_STARTED:
                event = "NAVIGATION_STARTED";
                break;
            case CustomTabsCallback.TAB_SHOWN:
                event = "TAB_SHOWN";
                break;
            case CustomTabsCallback.TAB_HIDDEN:
                event = "TAB_HIDDEN";
                break;
            default:
                event = String.valueOf(navigationEvent);
        }
        Log.d(TAG, "onNavigationEvent (navigationEvent=" + event + ')');
        mTextNavigation.setText("onNavigationEvent " + event);
    }
};

EngagementSignalsCallback unterstützt drei verschiedene Rückrufe:

onVerticalScrollEvent()
Wird jedes Mal aufgerufen, wenn der Nutzer die Scrollrichtung ändert. isDirectionUp (das erste Argument) gibt die Richtung an.
  1. onGreatestScrollPercentageIncreased: Der benutzerdefinierte Tab signalisiert die Scrolltiefe in 5 %-Intervallen bis zu 100 %, wenn der Nutzer den unteren Bereich der Seite erreicht hat. Der Callback wird erst aufgerufen, wenn der Nutzer das Scrollen beendet. Der Wert wird bei jeder neuen Navigation auf 0% zurückgesetzt.
  2. onSessionEnded: Dieses Ereignis wird vom benutzerdefinierten Tab ausgelöst, wenn keine Interaktionssignale mehr gesendet werden, z. B. nachdem der Nutzer den benutzerdefinierten Tab geschlossen hat. didUserInteract ist wahr, wenn der Nutzer auf irgendeine Weise mit der Seite interagiert hat (z. B. durch Scrollen oder Klicken auf eine Schaltfläche).
private EngagementSignalsCallback mEngagementSignalsCallback = new EngagementSignalsCallback() {
    @Override
    public void onVerticalScrollEvent(boolean isDirectionUp, @NonNull Bundle extras) {
        Log.d(TAG, "onVerticalScrollEvent (isDirectionUp=" + isDirectionUp + ')');
        mTextVerticalScroll.setText("vertical scroll " + (isDirectionUp ? "UP️" : "DOWN"));
    }

    @Override
    public void onGreatestScrollPercentageIncreased(int scrollPercentage, @NonNull Bundle extras) {
        Log.d(TAG, "scroll percentage: " + scrollPercentage + "%");
        mTextGreatestPercentage.setText("scroll percentage: " + scrollPercentage + "%");
    }

    @Override
    public void onSessionEnded(boolean didUserInteract, @NonNull Bundle extras) {
        Log.d(TAG, "onSessionEnded (didUserInteract=" + didUserInteract + ')');
        mTextSessionEnd.setText(didUserInteract ? "session ended with user interaction" : "session ended without user interaction");
    }
};

Sowohl für CustomTabsCallback als auch für EngagementSignalsCallback ist eine aktive Dienstverbindung für benutzerdefinierte Tabs erforderlich. Sobald die Verbindung zum Dienst hergestellt ist, können Sie eine neue CustomTabsSession erstellen, indem Sie CustomTabsClient.newSession() aufrufen und die CustomTabsCallback übergeben.

Rufen Sie danach isEngagementSignalsApiAvailable() auf, um zu prüfen, ob Interaktionssignale vom aktuellen Browser unterstützt werden. Wenn sie unterstützt werden, können Sie Ihre EngagementSignalsCallback über CustomTabsSession.setEngagementSignalsCallback() registrieren.

private CustomTabsClient mCustomTabsClient;
private CustomTabsSession mCustomTabsSession;

private final CustomTabsServiceConnection mServiceConnectionCallback = new CustomTabsServiceConnection() {

    @Override
    public void onCustomTabsServiceConnected(@NonNull ComponentName name, @NonNull CustomTabsClient client) {
        mCustomTabsClient = client;
        mCustomTabsSession = mCustomTabsClient.newSession(mCustomTabsCallback);
        try {
            boolean engagementSignalsApiAvailable = mCustomTabsSession.isEngagementSignalsApiAvailable(Bundle.EMPTY);
            if (!engagementSignalsApiAvailable) {
                Log.d(TAG, "CustomTab Engagement signals not available, make sure to use the " +
                        "latest Chrome version and enable via chrome://flags/#cct-real-time-engagement-signals");
                return;
            }
            mCustomTabsSession.setEngagementSignalsCallback(mEngagementSignalsCallback, Bundle.EMPTY);
        } catch (RemoteException e) {
            Log.w(TAG, "The Service died while responding to the request.", e);
        } catch (UnsupportedOperationException e) {
            Log.w(TAG, "Engagement Signals API isn't supported by the browser.", e);
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mCustomTabsClient = null;
        mConnection = null;
        mCustomTabsSession = null;
    }
};

Jetzt müssen Sie nur noch die CustomTabsService verknüpfen:

@Override
protected void onStart() {
    super.onStart();
    bindCustomTabsService();
}

private void bindCustomTabsService() {
    String packageName = CustomTabsHelper.getPackageNameToUse(this);
    if (packageName == null) return;
    CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}