Aquecimento e pré-busca: uso do serviço de guias personalizadas

A terceira parte deste guia se concentra no serviço Custom Tabs e por que usá-lo no seu aplicativo cria uma experiência do usuário melhor:

  • Abrir conteúdo externo instantaneamente:o uso de warmup() faz com que o processo do navegador seja iniciado em segundo plano antes mesmo que o usuário clique em um link e pode economizar até 700 ms ao abrir um link. mayLaunchUrl() faz a busca antecipada de páginas. O uso de ambas as APIs juntas permite que as páginas sejam carregadas instantaneamente, melhorando muito a experiência do usuário com a integração de guias personalizadas.
  • Melhor gerenciamento de guias personalizadas minimizadas: ao se conectar ao serviço de guias personalizadas e usar o mesmo CustomTabSession ao iniciar a guia personalizada, o Chrome poderá remover uma guia personalizada minimizada antes de abrir uma nova guia, oferecendo uma experiência do usuário mais consistente.

As etapas necessárias são:

  1. Verifique se o navegador padrão oferece suporte a guias personalizadas usando CustomTabsClient.getPackageName(...). Em caso afirmativo, vincule ao CustomTabsService usando CustomTabsClient.bindCustomTabsService().
  2. Depois de se conectar ao CustomTabsService, no callback CustomTabsServiceConnection.onCustomTabsServiceConnected(), faça o seguinte:

    a. Aqueça o processo do navegador usando CustomTabsClient.warmup(). b. Crie um novo CustomTabsSession usando CustomTabsClient.newSession().

  3. Opcionalmente, faça a pré-busca de páginas da Web que o usuário provavelmente vai visitar usando CustomTabsSession.mayLaunchUrl().

  4. Ao iniciar uma nova guia personalizada, transmita CustomTabsSession para CustomTabsIntent.Builder usando o construtor new CustomTabsIntent.Builder(session).

Se o app for direcionado para o nível 30 da API do Android, o CustomTabsClient.getPackageName(...) vai exigir que você adicione uma seção de consultas ao manifesto do Android, declarando um filtro de intent que corresponda a navegadores com suporte a guias personalizadas.

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

Confira um exemplo completo de como se conectar a um serviço das Abas personalizadas:

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

No Android, os URLs podem ser processados por aplicativos Android. Por exemplo, se o usuário tiver o app do Facebook instalado e clicar em um link para uma postagem, ele geralmente vai preferir que o link seja aberto no app do Facebook, e não no navegador.

Por padrão, as guias personalizadas abrem links no respectivo aplicativo Android, se ele estiver instalado. No entanto, depois que um CustomTabsServiceConnection é estabelecido, esse comportamento deixa de funcionar, e todos os URLs são abertos em guias personalizadas. Para melhorar a experiência do usuário, recomendamos reativar esse comportamento usando o seguinte código:

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

A seguir: saiba como redimensionar a experiência das guias personalizadas.