Questa guida spiega come misurare gli indicatori di coinvolgimento per le schede personalizzate di Chrome. Se la tua app mostra regolarmente agli utenti link a contenuti web, ad esempio in un feed di notizie, può essere importante sapere quali link sono ritenuti utili dagli utenti e quali no. Nelle schede personalizzate, puoi misurare il coinvolgimento degli utenti per una sessione specifica tramite il numero di navigazioni, le modifiche alla direzione di scorrimento e la profondità di scorrimento. Per vedere gli indicatori di coinvolgimento in azione, vai all'app demo sulle schede personalizzate su GitHub.
.Le schede personalizzate offrono due diversi callback per misurare il coinvolgimento degli utenti:
CustomTabsCallback
per monitorare eventi di navigazione di base, come"NAVIGATION_STARTED"
o"NAVIGATION_FINISHED"
.EngagementSignalsCallback
per monitorare il coinvolgimento degli utenti specifici con una pagina, ad esempio la direzione di scorrimento o la percentuale di scorrimento.
Entrambi richiedono una CustomTabsServiceConnection
attiva. Per informazioni dettagliate su come eseguire il collegamento a un CustomTabsService
, consulta la guida precedente a CustomTabsService
.
Per misurare il coinvolgimento degli utenti, crea prima un'istanza CustomTabsCallback
e un'istanza EngagementSignalsCallback
. CustomTabsCallback
riceve una costante navigationEvent
che descrive il tipo di navigazione avvenuta:
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
supporta tre diversi callback:
onVerticalScrollEvent()
- Richiamato ogni volta che l'utente cambia la direzione di scorrimento, dove
isDirectionUp
(il primo argomento) indica la direzione.
onGreatestScrollPercentageIncreased
: la Scheda personalizzata indica la profondità di scorrimento a intervalli del 5%, fino al 100% quando l'utente raggiunge la parte inferiore della pagina. Il callback viene attivato solo quando l'utente smette di scorrere. Il valore viene reimpostato su 0% a ogni nuova navigazione.onSessionEnded
: la Scheda personalizzata attiva questo evento quando smette di inviare indicatori di coinvolgimento (ad esempio, dopo che l'utente ha chiuso la scheda personalizzata).didUserInteract
sarà true se l'utente ha interagito con la pagina in qualsiasi modo (scorrimento, clic sul pulsante e così via).
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");
}
};
Sia CustomTabsCallback
sia EngagementSignalsCallback
richiedono una connessione al servizio Scheda personalizzata attiva. Una volta connesso il servizio, puoi creare un nuovo CustomTabsSession
chiamando CustomTabsClient.newSession()
e trasmettendo CustomTabsCallback
.
Successivamente, devi chiamare isEngagementSignalsApiAvailable()
per verificare se gli indicatori di coinvolgimento sono supportati dal browser corrente. Se sono supportati, puoi registrare EngagementSignalsCallback
tramite CustomTabsSession.setEngagementSignalsCallback()
.
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;
}
};
Non devi fare altro che associare CustomTabsService
:
@Override
protected void onStart() {
super.onStart();
bindCustomTabsService();
}
private void bindCustomTabsService() {
String packageName = CustomTabsHelper.getPackageNameToUse(this);
if (packageName == null) return;
CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}