In diesem Leitfaden wird erläutert, wie Sie Signale zur Interaktion auf benutzerdefinierten Chrome-Tabs messen. Wenn Nutzern in Ihrer App regelmäßig Links zu Webinhalten präsentiert werden, z. B. in einem Nachrichtenfeed, ist es unter Umständen wichtig zu wissen, welche Links Nutzer wertvoll finden und welche nicht. Auf benutzerdefinierten Tabs lassen sich sitzungsspezifische Nutzerinteraktionen über die Anzahl der Navigationen, Änderungen der Scrollrichtung und die Scrolltiefe messen. Wenn Sie Signale zur Interaktion in Aktion sehen möchten, rufen Sie die Demo-App für benutzerdefinierte Tabs auf GitHub auf.
Benutzerdefinierte Tabs bieten zwei verschiedene Callbacks zur Messung der Nutzerinteraktion:
CustomTabsCallback
zum Erfassen grundlegender Navigationsereignisse wie"NAVIGATION_STARTED"
oder"NAVIGATION_FINISHED"
EngagementSignalsCallback
zum Erfassen seitenspezifischer Nutzerinteraktionen, z. B. Scrollrichtung oder Scrollprozentsatz
Beide erfordern eine aktive CustomTabsServiceConnection
. Weitere Informationen zum Herstellen einer Verbindung mit einem CustomTabsService
findest du im vorherigen CustomTabsService
-Leitfaden.
Erstellen Sie zuerst eine CustomTabsCallback
- und eine EngagementSignalsCallback
-Instanz, um das Nutzer-Engagement zu messen. Der CustomTabsCallback
empfängt eine navigationEvent
-Konstante, die beschreibt, welche Art von 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);
}
};
Das EngagementSignalsCallback
unterstützt drei verschiedene Callbacks:
onVerticalScrollEvent()
- Wird jedes Mal aufgerufen, wenn der Nutzer die Scrollrichtung ändert, wobei
isDirectionUp
(das erste Argument) die Richtung angibt.
onGreatestScrollPercentageIncreased
: Der benutzerdefinierte Tab signalisiert die Scrolltiefe in 5 %-Intervallen bis zu 100 %, wenn der Nutzer den unteren Bereich der Seite erreicht. Der Callback wird erst aufgerufen, wenn der Nutzer das Scrollen beendet. Der Wert wird bei jeder neuen Navigation auf 0% zurückgesetzt.onSessionEnded
: Dieses Ereignis wird auf dem benutzerdefinierten Tab ausgelöst, wenn keine weiteren Interaktionsdaten mehr gesendet werden (z. B. nachdem der Nutzer den benutzerdefinierten Tab geschlossen hat).didUserInteract
ist „true“, wenn der Nutzer mit der Seite interagiert hat (Scrollen, Klicken auf eine Schaltfläche usw.).
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 CustomTabsCallback
als auch EngagementSignalsCallback
erfordern eine aktive Verbindung zum benutzerdefinierten Tab. Sobald der Dienst verbunden ist, können Sie ein neues CustomTabsSession
erstellen, indem Sie CustomTabsClient.newSession()
aufrufen und das CustomTabsCallback
-Objekt übergeben.
Anschließend kannst du isEngagementSignalsApiAvailable()
aufrufen, um zu prüfen, ob Signale zur Interaktion vom aktuellen Browser unterstützt werden. Wenn sie unterstützt werden, kannst du dein 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 CustomTabsService
binden:
@Override
protected void onStart() {
super.onStart();
bindCustomTabsService();
}
private void bindCustomTabsService() {
String packageName = CustomTabsHelper.getPackageNameToUse(this);
if (packageName == null) return;
CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}