et komplett eksempel er tilgjengelig på GitHub-prøveprogrammet. Den inneholder gjenbrukbare klasser for å tilpasse BRUKERGRENSESNITTET, koble til bakgrunnstjenesten og håndtere livssyklusen til både applikasjonen og den egendefinerte faneaktiviteten.
hvis du følger veiledningen fra denne siden, vil du kunne skape en god integrasjon.
det første trinnet for integrering Av Egendefinerte Faner er å legge Til AndroidX-Nettleserbiblioteket i prosjektet. Åpne filenapp/build.gradle
og legg til nettleserbiblioteket i delen avhengigheter.
dependencies {
...
implementation "androidx.browser:browser:1.3.0"
}
Når Nettleserbiblioteket er lagt til i prosjektet ditt, er det to sett med mulige tilpasninger:
- Tilpasse BRUKERGRENSESNITTET og samspillet med de egendefinerte fanene.
- Gjør siden lastes raskere, og holde programmet i live.
BRUKERGRENSESNITTTILPASNINGENE gjøres ved å brukeCustomTabsIntent
ogCustomTabsIntent.Builder
– klassene; ytelsesforbedringene oppnås ved å bruke CustomTabsClient
for å koble til Tjenesten Egendefinerte Faner, varme opp nettleseren og la den vite hvilke nettadresser som skal åpnes.
Åpne En Egendefinert Fane #
A CustomTabsIntent.Builder
kan brukes til å konfigurere En Egendefinert Fane. Når du er klar, ring CustomTabsIntent.Builder.build
for å opprette en CustomTabsIntent
og start ønsket Url med CustomTabsIntent.launchUrl
.
String url = ¨https://paul.kinlan.me/¨;
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));
Konfigurer fargen på adresselinjen #
En Av de viktigste (og enkleste å implementere) aspekter Av Tilpassede Faner er muligheten for deg å endre fargen på adresselinjen for å være i samsvar med appens tema.
tekstutdrag nedenfor endrer bakgrunnsfargen for adresselinjen. colorInt er en int som angir en Color
.
int coolorInt = Color.parseColor("#FF0000"); //red
builder.setToolbarColor(colorInt);
Konfigurer en egendefinert handlingsknapp #
builder.setActionButton(icon, description, pendingIntent, tint);
som utvikler av appen din har du full kontroll over Handlingsknappen som presenteres for brukerne dine i nettleserfanen.
i de fleste tilfeller vil Dette være en primær handling Som Del, Eller en annen vanlig aktivitet som brukerne vil utføre.
Handlingsknappen er representert som En Bunt med et ikon for handlingsknappen og en PendingIntent
som vil bli kalt av nettleseren når brukeren treffer handlingsknappen. Ikonet er currentlty 24dp i høyde og 24-48 dp i bredde.
det kan tilpasses ved å ringe CustomTabsIntentBuilder#setActionButton
:
-
icon
er enBitmap
som skal brukes som bildekilde for handlingsknappen. -
description
er enString
brukes som en tilgjengelig beskrivelse for knappen. -
pendingIntent
er enPendingIntent
for å starte når handlingsknappen eller menyelementet ble tappet. Nettleseren vil ringePendingIntent#send
på kraner etter å ha lagt til nettadressen som data. Klienten app kan ringeIntent#getDataString
for å få url. -
tint
er en boolsk som definerer Om Handlingsknappen skal tones.
Konfigurer en egendefinert meny #
builder.addMenuItem(menuItemTitle, menuItemPendingIntent);
nettleseren har en omfattende meny med handlinger som brukere vil utføre ofte i en nettleser, men de kan ikke være relevante for programkonteksten din.
Egendefinerte Faner vil ha et sett med standardhandlinger levert av nettleseren. Disse handlingene kan inkludere elementer som «Videresend», «Sideinformasjon», «Oppdater», «Finn På Side»eller» Åpne I Nettleser».
som utvikler kan du legge til og tilpasse opptil fem menyelementer som vises mellom ikonraden og fotelementene.
et menyelement legges til ved å ringeCustomTabsIntent.Builder#addMenuItem
med tittel og en PendingIntent
den nettleseren vil ringe på dine vegne når brukeren trykker på elementet sendes som parametere.
Konfigurer egendefinerte inn-og utkjøringsanimasjoner #
mange Android-programmer bruker egendefinerte Inn-og Utkjøringsanimasjoner når De overfører Mellom Aktiviteter På Android. Egendefinerte Faner er ikke annerledes, du kan endre inngang og utgang (når brukeren trykker Tilbake) animasjoner for å holde dem i samsvar med resten av programmet.
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);
Varm opp nettleseren for å få sider til å lastes raskere #
som standard, når CustomTabsIntent#launchUrl
kalles, vil den spinne opp nettleseren og starte NETTADRESSEN. Dette kan ta opp dyrebar tid og innvirkning på oppfatningen av glatthet.Vi tror at brukerne krever en nesten øyeblikkelig opplevelse, så vi har gitt en Tjeneste som appen din kan koble til og fortelle nettleseren og dens innfødte komponenter å varme opp. Egendefinerte Faner gir også muligheten for deg, utvikleren å fortelle nettleseren det sannsynlige settet av nettsider brukeren vil besøke. Nettlesere vil da kunne utføre:
- DNS-forhåndsoppløsning av hoveddomenet
- DNS-forhåndsoppløsning av de mest sannsynlige underressursene
- pre-tilkobling til destinasjonen, inkludert HTTPS / TLS-forhandling.
prosessen for oppvarming av nettleseren er som følger:
- Bruk
CustomTabsClient#bindCustomTabsService
for å koble til tjenesten. - når tjenesten er tilkoblet, ring
CustomTabsClient#warmup
for å starte nettleseren bak kulissene. - Ring
CustomTabsClient#newSession
for å opprette en ny økt. Denne sesjonen brukes for alle forespørsler TIL API. - legg Eventuelt til en
CustomTabsCallback
som en parameter når du oppretter en ny økt, slik at du vet at en side ble lastet. - Fortell leseren hvilke sider brukeren sannsynligvis vil laste med
CustomTabsSession#mayLaunchUrl
- Ring
CustomTabsIntent.Builder
konstruktøren som passerer den opprettedeCustomTabsSession
som en parameter.
Koble Til Tjenesten Egendefinerte Faner #
metoden CustomTabsClient#bindCustomTabsService
fjerner kompleksiteten ved å koble til Tjenesten Egendefinerte Faner.
Opprett en klasse som utviderCustomTabsServiceConnection
og brukonCustomTabsServiceConnected
for å få en forekomst avCustomTabsClient
. Denne forekomsten vil være nødvendig i de neste trinnene.
// 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);
Varm Opp Nettleseren Prosessen #
boolean warmup(long flags)
Varmer opp nettleseren prosessen og laster de innfødte biblioteker. Warmup er asynkron, returverdien angir om forespørselen er godtatt. Flere vellykkede samtaler vil også returnere true.
Returnerer true
hvis vellykket.
Opprett en ny tab-økt #
boolean newSession(CustomTabsCallback callback)
Sesjon brukes i etterfølgende samtaler for å koble mayLaunchUrl-samtalen, CustomTabsIntent og fanen generert til hverandre. Tilbakeringingen som er oppgitt her, er knyttet til den opprettede økten. Eventuelle oppdateringer for den opprettede økten (Se Egendefinerte Faner Tilbakeringing nedenfor) er også mottatt gjennom denne tilbakeringing. Returnerer om en økt ble opprettet. Flere anrop med Samme CustomTabsCallback eller en nullverdi vil returnere false.
Fortell nettleseren Hvilke Nettadresser brukeren sannsynligvis vil åpne #
boolean mayLaunchUrl(Uri url, Bundle extras, List<Bundle> otherLikelyBundles)
Denne CustomTabsSession-metoden forteller nettleseren om en sannsynlig fremtidig navigering til EN URL. Metoden warmup()
bør kalles først som en beste praksis. DEN MEST sannsynlige URL må angis først. Eventuelt kan en liste over andre sannsynlige Nettadresser gis. De blir behandlet som mindre sannsynlig enn den første, og må sorteres i avtagende prioritetsordre. Disse Ekstra Nettadressene kan ignoreres. Alle tidligere samtaler til denne metoden vil bli nedprioritert. Returnerer om operasjonen er fullført.
Tilpassede Faner Tilkobling Tilbakeringing #
void onNavigationEvent(int navigationEvent, Bundle extras)
vil bli kalt når en navigasjonshendelse skjer i kategorien egendefinert. navigationEvent int
er en av 6 verdier som definerer tilstanden til siden er i. Se nedenfor for mer informasjon.
/**
* 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;
hva skjer hvis brukeren ikke har en nettleser som støtter Egendefinerte Faner installert? #
Tilpassede Faner støttes av De Fleste Android-nettlesere. Likevel, siden den bruker enACTION_VIEW
Intent med viktige Tillegg for å tilpasse BRUKERGRENSESNITTET, åpnes det i systemleseren, eller brukerens standard nettleser hvis Egendefinerte Faner ikke støttes.
hvis brukeren har en nettleser som støtter Tilpasset Fane installert og det er standard nettleser, vil det automatisk plukke OPP STATISTER og presentere en tilpasset UI.
Hvordan kan jeg sjekke Om Android-enheten har en nettleser som støtter Tilpasset Fane? #
Det er mulig å bruke PackageManager
å spørre Android-enhet for programmer som kan håndtere Egendefinerte Faner. Vi spør etter programmer som kan håndtere http
Hensikter, så sjekk om disse programmene også erklærer støtte For Tjenesten Custom Tabs:
/**
* 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 har introdusert pakkevisiblity endringer. Hvis Android-appen din målretter MOT API-nivå 30 eller høyere, legger du til en queries
seksjon til AndroidManifest.xml
er nødvendig, ellers vil kodebiten ovenfor ikke returnere resultater:
<queries>
<intent>
<action android:name=
"android.support.customtabs.action.CustomTabsService" />
</intent>
</queries>