et komplet eksempel er tilgængeligt på GitHub-prøveapplikationen. Den indeholder genanvendelige klasser til at tilpasse brugergrænsefladen, oprette forbindelse til baggrundstjenesten og håndtere livscyklussen for både applikationen og den brugerdefinerede faneaktivitet.
Hvis du følger vejledningen fra denne side, vil du være i stand til at skabe en stor integration.
det første trin til en brugerdefineret Faneintegration er at tilføje biblioteket til dit projekt. Åbn filen app/build.gradle
og tilføj biblioteksbiblioteket til afsnittet afhængigheder.
dependencies {
...
implementation "androidx.browser:browser:1.3.0"
}
når biblioteket er føjet til dit projekt, er der to sæt mulige tilpasninger:
- tilpasning af brugergrænsefladen og interaktion med de brugerdefinerede faner.
- gør siden indlæses hurtigere, og holde programmet i live.
UI-tilpasningerne udføres ved hjælp afCustomTabsIntent
ogCustomTabsIntent.Builder
klasser; ydelsesforbedringerne opnås ved at bruge CustomTabsClient
for at oprette forbindelse til tjenesten Custom Tabs, varme op bro.ser og lade den vide, hvilke URL ‘ er der åbnes.
åbning af en brugerdefineret fane #
ACustomTabsIntent.Builder
kan bruges til at konfigurere en brugerdefineret fane. Når du er klar, skal du ringe CustomTabsIntent.Builder.build
for at oprette en CustomTabsIntent
og starte den ønskede 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 farven på adresselinjen #
et af de vigtigste (og enkleste at implementere) aspekter af brugerdefinerede faner er muligheden for dig at ændre farven på adresselinjen for at være i overensstemmelse med din apps tema.
uddraget nedenfor ændrer baggrundsfarven for adresselinjen. colorInt er en int, der angiver en Color
.
int coolorInt = Color.parseColor("#FF0000"); //red
builder.setToolbarColor(colorInt);
Konfigurer en brugerdefineret handlingsknap #
builder.setActionButton(icon, description, pendingIntent, tint);
som udvikler af din app har du fuld kontrol over handlingsknappen, der præsenteres for dine brugere inden for fanen bro.ser.
i de fleste tilfælde vil dette være en primær handling som del eller en anden almindelig aktivitet, som dine brugere vil udføre.
handlingsknappen er repræsenteret som et bundt med et ikon for handlingsknappen og etPendingIntent
, der kaldes af bro.sereren, når din bruger rammer handlingsknappen. Ikonet er aktuelt 24dp i højden og 24-48 dp i bredden.
det kan tilpasses ved at kalde CustomTabsIntentBuilder#setActionButton
:
-
icon
er enBitmap
skal bruges som billedkilde til handlingsknappen. -
description
er enString
bruges som en tilgængelig beskrivelse for knappen. -
pendingIntent
er enPendingIntent
for at starte, når handlingsknappen eller menupunktet blev tappet. Søgeren ringerPendingIntent#send
på vandhaner efter tilføjelse af url ‘ en som data. Klientappen kan ringeIntent#getDataString
for at få url ‘ en. -
tint
er en boolsk, der definerer, om handlingsknappen skal tones.
Konfigurer en brugerdefineret menu #
builder.addMenuItem(menuItemTitle, menuItemPendingIntent);
bro.ser har en omfattende menu med handlinger, som brugerne ofte udfører i en bro. ser, men de er muligvis ikke relevante for din applikationskontekst.
brugerdefinerede faner har et sæt standardhandlinger, der leveres af bro.sereren. Disse handlinger kan omfatte elementer som” Videresend”,” sideinfo”,” Opdater”,” Find i Side “eller”åbn i Bro.ser”.
som udvikler kan du tilføje og tilpasse op til fem menupunkter, der vises mellem ikonrækken og fodelementerne.
et menupunkt tilføjes ved at kaldeCustomTabsIntent.Builder#addMenuItem
med titel og enPendingIntent
den bro.ser vil ringe på dine vegne, når brugeren trykker på elementet sendes som parametre.
Konfigurer brugerdefinerede enter og afslut animationer #
mange Android-applikationer bruger brugerdefineret visning indgangs-og Udgangsanimationer, når de skifter mellem aktiviteter på Android. Brugerdefinerede faner er ikke anderledes, Du kan ændre indgang og udgang (når brugeren trykker tilbage) animationer for at holde dem i overensstemmelse med resten af din ansøgning.
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);
opvarm bro.sereren for at få siderne til at indlæse hurtigere #
som standard, nårCustomTabsIntent#launchUrl
kaldes, vil den spinde bro. sereren op og starte URL ‘ en. Dette kan tage dyrebar tid og påvirke opfattelsen af glathed.
Vi mener, at brugerne kræver en næsten øjeblikkelig oplevelse, så vi har leveret en Service, som din app kan oprette forbindelse til og bede bro.sereren og dens oprindelige komponenter om at varme op. Brugerdefinerede faner giver også mulighed for dig, udvikleren til at fortælle bro.ser sandsynligvis sæt af hjemmesider brugeren vil besøge. DNS-foropløsning af hoveddomænet
processen til opvarmning af bro.ser er som følger:
- brug
CustomTabsClient#bindCustomTabsService
for at oprette forbindelse til tjenesten. - når tjenesten er tilsluttet, skal du ringe til
CustomTabsClient#warmup
for at starte bro.ser bag kulisserne. - Ring
CustomTabsClient#newSession
for at oprette en ny session. Denne session bruges til alle anmodninger til API. - vedhæft eventuelt en
CustomTabsCallback
som parameter, når du opretter en ny session, så du ved, at en side blev indlæst. - Fortæl, hvilke sider brugeren sandsynligvis vil indlæse med
CustomTabsSession#mayLaunchUrl
- ring til
CustomTabsIntent.Builder
konstruktør, der passerer den oprettedeCustomTabsSession
som parameter.
Opret forbindelse til tjenesten Custom Tabs #
CustomTabsClient#bindCustomTabsService
– metoden fjerner kompleksiteten ved at oprette forbindelse til tjenesten Custom Tabs.
Opret en klasse, der udvider CustomTabsServiceConnection
og brug onCustomTabsServiceConnected
for at få en forekomst af CustomTabsClient
. Denne instans vil være nødvendig på de næste trin.
// 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 op bro.Serprocessen #
boolean warmup(long flags)
varmer bro. serprocessen op og indlæser de oprindelige biblioteker. Opvarmning er asynkron, returværdien angiver, om anmodningen er blevet accepteret. Flere vellykkede opkald vil også vende tilbage sandt.
returnerer true
hvis det lykkes.
Opret en ny fanesession #
boolean newSession(CustomTabsCallback callback)
Session bruges i efterfølgende opkald til at linke mayLaunchUrl-opkald, CustomTabsIntent og fanen genereret til hinanden. Tilbagekaldelsen, der leveres her, er knyttet til den oprettede session. Eventuelle opdateringer til den oprettede session (se brugerdefinerede faner tilbagekald nedenfor) modtages også via denne tilbagekald. Returnerer, om en session blev oprettet. Flere opkald med samme CustomTabsCallback eller en null værdi vil returnere false.
Fortæl brugeren, hvilke URL ‘ er brugeren sandsynligvis vil åbne #
boolean mayLaunchUrl(Uri url, Bundle extras, List<Bundle> otherLikelyBundles)
denne CustomTabsSession-metode fortæller bro.sereren om en sandsynlig fremtidig navigation til en URL. Metoden warmup()
skal først kaldes som en bedste praksis. Den mest sandsynlige URL skal angives først. Eventuelt kan en liste over andre sandsynlige URL ‘ er leveres. De behandles som mindre sandsynlige end den første og skal sorteres i faldende prioriteret rækkefølge. Disse yderligere URL ‘ er kan ignoreres. Alle tidligere opkald til denne metode vil blive deprioriteret. Returnerer, om operationen er fuldført.
brugerdefinerede faner forbindelse tilbagekald #
void onNavigationEvent(int navigationEvent, Bundle extras)
vil blive kaldt, når en navigationshændelse sker i fanen Brugerdefineret. navigationEvent int
er en af 6 værdier, der definerer tilstanden på siden er i. Se nedenfor for mere information.
/**
* 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;
Hvad sker der, hvis brugeren ikke har en bro. ser, der understøtter brugerdefinerede faner installeret? #
brugerdefinerede faner understøttes af de fleste Android-brugere. Ikke desto mindre, da det bruger en ACTION_VIEW
hensigt med nøgle ekstramateriale til at tilpasse brugergrænsefladen, åbnes den i systemsøgeren eller brugerens standardsøgemaskine, hvis brugerdefinerede faner ikke understøttes.
Hvis brugeren har en bro.ser, der understøtter brugerdefineret fane installeret, og det er standard bro. ser, vil det automatisk afhente ekstramateriale og præsentere en tilpasset UI.
Hvordan kan jeg kontrollere, om Android-enheden har en bro. ser, der understøtter brugerdefineret fane? #
det er muligt at bruge PackageManager
til at forespørge Android-enheden til applikationer, der kan håndtere brugerdefinerede faner. Vi forespørger efter applikationer, der er i stand til at håndtere http
hensigter, og kontroller derefter, om disse applikationer også erklærer support til 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 indført pakke synlighedsændringer. Hvis din Android-app er målrettet mod API-niveau 30 eller derover, skal du tilføje enqueries
sektion til AndroidManifest.xml
er nødvendig, ellers returnerer kodestykket ovenfor ikke resultater:
<queries>
<intent>
<action android:name=
"android.support.customtabs.action.CustomTabsService" />
</intent>
</queries>