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:
- Verifique se o navegador padrão oferece suporte a guias personalizadas usando
CustomTabsClient.getPackageName(...)
. Em caso afirmativo, vincule ao CustomTabsService usandoCustomTabsClient.bindCustomTabsService()
. 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 novoCustomTabsSession
usandoCustomTabsClient.newSession()
.Opcionalmente, faça a pré-busca de páginas da Web que o usuário provavelmente vai visitar usando
CustomTabsSession.mayLaunchUrl()
.Ao iniciar uma nova guia personalizada, transmita
CustomTabsSession
para CustomTabsIntent.Builder usando o construtornew 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));
}
});
}
Abrir links em apps Android
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.