um exemplo completo está disponível na aplicação de exemplo GitHub. Ele contém classes reutilizáveis para personalizar a UI, conectar-se ao serviço de fundo, e lidar com o ciclo de vida da aplicação e da atividade tabulação personalizada.
Se você seguir a orientação desta página, você será capaz de criar uma grande integração.
o primeiro passo para uma integração personalizada de páginas é adicionar a Biblioteca do navegador AndroidX ao seu projecto. Abra o ficheiro app/build.gradle
e adicione a biblioteca do navegador à secção de dependências.
dependencies {
...
implementation "androidx.browser:browser:1.3.0"
}
Uma vez que a Biblioteca do navegador é adicionada ao seu projecto, existem dois conjuntos de possíveis personalizações:
- personalizar a UI e a interacção com as páginas personalizadas.tornando a carga da Página mais rápida e mantendo a aplicação viva.
As personalizações da IU são feitas usando as classes CustomTabsIntent
e o CustomTabsIntent.Builder
; as melhorias de desempenho são conseguidas usando o CustomTabsClient
para se conectar ao Serviço de páginas personalizadas, aquecer o navegador e deixá-lo saber quais urls serão abertos.
abrir uma página personalizada #
a CustomTabsIntent.Builder
pode ser usada para configurar uma página personalizada. Uma vez pronto, chame CustomTabsIntent.Builder.build
para criar um CustomTabsIntent
e lance o Url desejado com CustomTabsIntent.launchUrl
.
String url = ¨https://paul.kinlan.me/¨;
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));
Configurar a cor da barra de endereços #
Um dos mais importantes (e mais simples de implementar) aspectos de Guias Personalizadas é a capacidade para que você altere a cor da barra de endereço para ser consistente com o seu aplicativo do tema.
o excerto abaixo muda a cor de fundo da barra de endereços. colorInt é um int que especifica um Color
.
int coolorInt = Color.parseColor("#FF0000"); //red
builder.setToolbarColor(colorInt);
Configurar uma ação personalizada botão #
builder.setActionButton(icon, description, pendingIntent, tint);
Como o desenvolvedor do aplicativo, você tem controle completo sobre o Botão de Ação, que é apresentada ao seu blog dentro do guia do navegador.
na maioria dos casos, esta será uma ação primária, como Share, ou outra atividade comum que seus usuários irão realizar.
O Botão de Acção é representado como um pacote com um ícone do botão de acção e um PendingIntent
que será chamado pelo navegador quando o seu utilizador carregar no botão de Acção. O ícone é atualmente 24dp em altura e 24-48 dp em largura.
Ele pode ser personalizado chamando CustomTabsIntentBuilder#setActionButton
:
-
icon
é umBitmap
para ser usado como fonte da imagem para o botão de ação. -
description
is aString
be used as an accessible description for the button. -
pendingIntent
é umPendingIntent
para lançar quando o botão de acção ou item do menu foi carregado. O navegador vai chamar em torneiras após adicionar o url como dados. O aplicativo cliente pode chamarIntent#getDataString
para obter o url. -
tint
é um booleano que define se o botão de ação deve ser colorido.
Configurar um menu personalizado #
builder.addMenuItem(menuItemTitle, menuItemPendingIntent);
O navegador tem um menu completo de ações que os usuários realizam com freqüência dentro de um navegador, no entanto, elas podem não ser relevantes para o seu contexto de aplicação.
As páginas personalizadas terão um conjunto de acções predefinidas fornecidas pelo navegador. Essas ações podem incluir itens como” Forward”,” Page Info”,” Refresh”,” Find in Page “ou”Open in Browser”.
como programador, poderá adicionar e personalizar até cinco itens do menu que irão aparecer entre a linha de ícones e os itens do pé.
Um item de menu é adicionado chamando CustomTabsIntent.Builder#addMenuItem
com o título e uma PendingIntent
navegador que vai chamar seu nome quando o usuário toca o item de são passados como parâmetros.
Configure personal enter and exit animations #
muitas aplicações Android usam personal View entry and Exit animations quando transitam entre atividades no Android. Tabs personalizados não é diferente, você pode mudar a entrada e saída (quando o usuário pressiona para trás) animações para mantê-los consistentes com o resto de sua aplicação.
builder.setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left);
builder.setExitAnimations(this, R.anim.slide_in_left, R.anim.slide_out_right);
aqueça o navegador para fazer com que as páginas carreguem mais rápido #
por padrão, quando CustomTabsIntent#launchUrl
, irá rodar o navegador e lançar o URL. Isso pode levar tempo precioso e impacto na percepção da suavidade.
acreditamos que os usuários exigem uma experiência quase instantânea, por isso temos fornecido um serviço ao qual o seu aplicativo pode se conectar e dizer ao navegador e seus componentes nativos para aquecer. Páginas personalizadas também fornecem a capacidade para você, o desenvolvedor para dizer ao navegador o conjunto provável de páginas web que o usuário irá visitar. Os navegadores poderão então executar:
- DNS pré-resolução do domínio principal
- DNS pré-resolução dos sub-recursos mais prováveis
- pré-ligação ao destino, incluindo a negociação HTTPS / TLS.
o processo de aquecimento do navegador é o seguinte:
- Use
CustomTabsClient#bindCustomTabsService
para se ligar ao serviço. - Uma vez que o serviço está conectado, chame
CustomTabsClient#warmup
para iniciar o navegador nos bastidores. - Call
CustomTabsClient#newSession
para criar uma nova sessão. Esta sessão é usada para todos os pedidos à API.opcionalmente, anexe umCustomTabsCallback
como um parâmetro ao criar uma nova sessão, para que saiba que uma página foi carregada. - informam ao navegador que páginas é provável que o usuário carregar com
CustomTabsSession#mayLaunchUrl
- Chamada de
CustomTabsIntent.Builder
construtor passando o criado.CustomTabsSession
como um parâmetro.
ligue-se ao Serviço de páginas personalizadas #
o CustomTabsClient#bindCustomTabsService
o método retira a complexidade da ligação ao Serviço de páginas personalizadas.
Criar uma classe que estende CustomTabsServiceConnection
e usar onCustomTabsServiceConnected
para obter uma instância de CustomTabsClient
. Este exemplo será necessário nos próximos passos.
// Package name for the Chrome channel the client wants to connect to. This
// depends on the channel name.
// Stable = com.android.chrome
// Beta = com.chrome.beta
// Dev = com.chrome.dev
public static final String CUSTOM_TAB_PACKAGE_NAME = "com.android.chrome"; // Change when in stable
CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
mCustomTabsClient = client;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
boolean ok = CustomTabsClient.bindCustomTabsService(this, mPackageNameToBind, connection);
aqueça o Navegador Processo #
boolean warmup(long flags)
Aquece o processo do navegador e carrega as bibliotecas nativas. O aquecimento é assíncrono, o valor de retorno indica se o pedido foi aceito. Várias chamadas de sucesso também retornarão verdadeiras.
Devolve true
se bem sucedido.
crie uma nova sessão de tabulação #
boolean newSession(CustomTabsCallback callback)
essão é usada em chamadas subsequentes para ligar a chamada mayLaunchUrl, o Personaltabsintent e a página gerada uma para a outra. O callback fornecido aqui está associado com a sessão criada. Todas as atualizações para a sessão criada (veja a chamada de páginas personalizadas abaixo) também são recebidas através desta chamada de volta. Devolve se uma sessão foi criada com sucesso. Várias chamadas com o mesmo CustomTabsCallback ou um valor nulo irá retornar false.
diga ao navegador quais os URLs que o utilizador provavelmente irá abrir #
boolean mayLaunchUrl(Uri url, Bundle extras, List<Bundle> otherLikelyBundles)
este método de personalização diz ao navegador de uma navegação futura provável para um URL. O método warmup()
deve ser chamado primeiro como uma melhor prática. A URL mais provável tem que ser especificada primeiro. Opcionalmente, pode ser fornecida uma lista de outros URLs prováveis. São tratados como menos prováveis do que o primeiro, e têm de ser ordenados por ordem decrescente de prioridade. Estes URLs adicionais podem ser ignorados. Todas as chamadas anteriores a este método serão retiradas. Devolve se a operação foi concluída com sucesso.
Personal Tabs Connection Callback #
void onNavigationEvent(int navigationEvent, Bundle extras)
será chamada quando um evento de navegação acontecer na página personalizada. O navigationEvent int
é um dos 6 valores que define o estado da página. Veja abaixo para mais informações.
/**
* Sent when the tab has started loading a page.
*/
public static final int NAVIGATION_STARTED = 1;
/**
* Sent when the tab has finished loading a page.
*/
public static final int NAVIGATION_FINISHED = 2;
/**
* Sent when the tab couldn't finish loading due to a failure.
*/
public static final int NAVIGATION_FAILED = 3;
/**
* Sent when loading was aborted by a user action before it finishes like clicking on a link
* or refreshing the page.
*/
public static final int NAVIGATION_ABORTED = 4;
/**
* Sent when the tab becomes visible.
*/
public static final int TAB_SHOWN = 5;
/**
* Sent when the tab becomes hidden.
*/
public static final int TAB_HIDDEN = 6;
o que acontece se o utilizador não tiver um navegador que suporte páginas personalizadas instaladas? #
as páginas personalizadas são suportadas pela maioria dos navegadores Android. No entanto, uma vez que ele usa um ACTION_VIEW
intenção com Extras de chaves para personalizar a interface que irá abrir no navegador do sistema, ou o navegador padrão do Usuário se as páginas personalizadas não são suportadas.
Se o utilizador tiver um navegador que suporte a página personalizada instalada e for o navegador predefinido, irá automaticamente pegar nos EXTRAS e apresentar uma interface de utilizador personalizada.
Como posso verificar se o dispositivo Android tem um navegador que suporta a página personalizada? #
é possível usar o PackageManager
para consultar o dispositivo Android para aplicações que pode lidar com Guias Personalizadas. Nós procuramos por aplicações que sejam capazes de lidar com http
tentativas, em seguida, verifique se essas aplicações também declaram suporte para o serviço de páginas personalizadas:
/**
* Returns a list of packages that support Custom Tabs.
*/
public static ArrayList<ResolveInfo> getCustomTabsPackages(Context context) {
PackageManager pm = context.getPackageManager();
// Get default VIEW intent handler.
Intent activityIntent = new Intent()
.setAction(Intent.ACTION_VIEW)
.addCategory(Intent.CATEGORY_BROWSABLE)
.setData(Uri.fromParts("http", "", null));
// Get all apps that can handle VIEW intents.
List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(activityIntent, 0);
ArrayList<ResolveInfo> packagesSupportingCustomTabs = new ArrayList<>();
for (ResolveInfo info : resolvedActivityList) {
Intent serviceIntent = new Intent();
serviceIntent.setAction(ACTION_CUSTOM_TABS_CONNECTION);
serviceIntent.setPackage(info.activityInfo.packageName);
// Check if this package also resolves the Custom Tabs service.
if (pm.resolveService(serviceIntent, 0) != null) {
packagesSupportingCustomTabs.add(info);
}
}
return packagesSupportingCustomTabs;
}
Android 11 introduziu alterações de visibilidade do pacote. Se a aplicação Android estiver a atingir o nível 30 ou superior da API, é necessário adicionar um queries
secção a AndroidManifest.xml
, caso contrário o excerto do código acima não irá devolver resultados:
<queries>
<intent>
<action android:name=
"android.support.customtabs.action.CustomTabsService" />
</intent>
</queries>