Préparation et préchargement: utilisation du service d'onglets personnalisés

La troisième partie de ce guide se concentre sur le service d'onglets personnalisés et explique pourquoi son utilisation dans votre application permet d'améliorer l'expérience utilisateur:

  • Ouvrir instantanément le contenu externe:si vous utilisez warmup(), le processus du navigateur démarre en arrière-plan avant même que l'utilisateur ne clique sur un lien, ce qui peut économiser jusqu'à 700 ms à l'ouverture d'un lien. mayLaunchUrl() précharge les pages. L'utilisation conjointe des deux API permet aux pages de se charger instantanément, ce qui améliore considérablement l'expérience utilisateur grâce à l'intégration des onglets personnalisés.
  • Gestion améliorée des onglets personnalisés réduits: en vous connectant au service Onglets personnalisés et en utilisant le même CustomTabSession lors du lancement de l'onglet personnalisé, Chrome pourra supprimer les onglets personnalisés précédemment réduits avant de lancer un nouvel onglet, offrant ainsi une expérience utilisateur plus cohérente.

Voici les étapes à suivre:

  1. Vérifiez si le navigateur par défaut est compatible avec les onglets personnalisés à l'aide de CustomTabsClient.getPackageName(...). Si oui, associez-le à CustomTabsService à l'aide de CustomTabsClient.bindCustomTabsService().
  2. Une fois connecté à CustomTabsService, dans le rappel CustomTabsServiceConnection.onCustomTabsServiceConnected(), procédez comme suit:

    a. Préchauffez le processus du navigateur à l'aide de CustomTabsClient.warmup(). b. Créez un CustomTabsSession à l'aide de CustomTabsClient.newSession().

  3. Précharger éventuellement les pages Web que l'utilisateur est susceptible de consulter à l'aide de CustomTabsSession.mayLaunchUrl()

  4. Lorsque vous lancez un nouvel onglet personnalisé, transmettez CustomTabsSession à CustomTabsIntent.Builder à l'aide du constructeur new CustomTabsIntent.Builder(session).

Si votre application cible le niveau d'API Android 30, CustomTabsClient.getPackageName(...) vous demande d'ajouter une section "Requêtes" à votre fichier manifeste Android, en déclarant un filtre d'intent qui correspond aux navigateurs compatibles avec les onglets personnalisés.

<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>

Voici un exemple complet de connexion à un service Onglets personnalisés:

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));
        }
    });
}

Sur Android, les URL peuvent être gérées par les applications Android. Par exemple, si l'utilisateur a installé l'application Facebook et clique sur un lien vers un post Facebook, il préfère généralement que le lien s'ouvre dans l'application Facebook plutôt que dans le navigateur.

Par défaut, les onglets personnalisés ouvrent les liens dans l'application Android correspondante, si celle-ci est installée. Toutefois, une fois qu'une CustomTabsServiceConnection a été établie, ce comportement cesse de fonctionner et toutes les URL s'ouvrent dans des onglets personnalisés. Pour améliorer l'expérience utilisateur, nous vous recommandons de réactiver ce comportement à l'aide du code suivant:

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

Étape suivante: Découvrez comment redimensionner l'interface des onglets personnalisés.