Implementation guide

täydellinen esimerkki löytyy GitHub-näytesovelluksesta. Se sisältää uudelleenkäytettäviä luokkia käyttöliittymän mukauttamiseksi, yhteyden muodostamiseksi taustapalveluun ja sekä sovelluksen että mukautetun välilehden toiminnan elinkaaren käsittelemiseksi.

Jos noudatat tämän sivun ohjeita, voit luoda suuren integraation.

ensimmäinen vaihe mukautettujen välilehtien integroinnissa on AndroidX-Selainkirjaston lisääminen projektiin. Avaa app/build.gradle tiedosto ja lisää selainkirjasto riippuvuudet-osioon.

dependencies {
...
implementation "androidx.browser:browser:1.3.0"
}

kun Selainkirjasto on lisätty projektiin, on olemassa Kahdet mahdolliset muokkaukset:

  • käyttöliittymän muokkaaminen ja vuorovaikutus mukautettujen välilehtien kanssa.
  • sivun lataaminen nopeammaksi ja sovelluksen pitäminen elossa.

käyttöliittymän muokkaukset tehdään käyttämällä CustomTabsIntent ja CustomTabsIntent.Builder luokkia; suorituskykyparannukset saavutetaan käyttämällä CustomTabsClient yhteyden muodostamiseen mukautettuun Välilehtipalveluun, selaimen lämmittämiseen ja siihen, mitkä URL-osoitteet avataan.

mukautetun välilehden avaaminen #

a CustomTabsIntent.Builder voidaan käyttää mukautetun välilehden määrittämiseen. Kun olet valmis, soita CustomTabsIntent.Builder.build luodaksesi CustomTabsIntent ja käynnistä haluttu Url CustomTabsIntent.launchUrl.

String url = ¨https://paul.kinlan.me/¨;
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));

Määritä osoiterivin väri #

yksi tärkeimmistä (ja yksinkertaisimmista toteuttaa) osa-alueista mukautetuissa välilehdissä on kyky muuttaa osoiterivin väriä vastaamaan sovelluksesi teemaa.

alla oleva pätkä muuttaa osoiterivin taustavärin. colorInt on int, joka määrittää Color.

int coolorInt = Color.parseColor("#FF0000"); //red
builder.setToolbarColor(colorInt);

Configure a custom action button #

builder.setActionButton(icon, description, pendingIntent, tint);

kuvakaappaus Tumblr-sovelluksen Toimintopainikkeesta

sovelluksesi kehittäjänä sinulla on täysi valta käyttäjillesi selaimen välilehden sisällä esitettävään Toimintopainikkeeseen.

useimmissa tapauksissa tämä on ensisijainen toiminto, kuten Jaa, tai muu yleinen toiminto, jonka käyttäjät suorittavat.

Toimintonappi esitetään nippuna, jossa on toimintonapin kuvake ja PendingIntent jota selain kutsuu käyttäjän painaessa toimintonappia. Kuvake on currenty 24dp korkeus ja 24-48 dp leveys.

sen voi kustomoida kutsumalla CustomTabsIntentBuilder#setActionButton:

  • icon on Bitmap käytettäväksi toimintonapin kuvanlähteenä.
  • description on String, jota voidaan käyttää nappulan esteettömänä kuvauksena.
  • pendingIntent on PendingIntent käynnistää, kun toimintopainiketta tai valikkokohtaa napautetaan. Selain kutsuu PendingIntent#send hanoille lisättyään url-osoitteen dataksi. Asiakassovellus voi soittaa Intent#getDataString saadakseen url-osoitteen.
  • tint on Boolen, joka määrittelee, pitääkö Toimintonappi sävyttää.

Configure a custom menu #

builder.addMenuItem(menuItemTitle, menuItemPendingIntent);

kuvakaappaus Twitter-sovelluksen valikosta

selaimella on kattava valikko toimintoja, joita käyttäjät suorittavat usein selaimen sisällä, mutta niillä ei välttämättä ole merkitystä sovellukseesi.

mukautetuilla välilehdillä on joukko selaimen tarjoamia oletustoimintoja. Nämä toimet voivat sisältää kohteita, kuten ”eteenpäin”, ”sivu Info”, ”Päivitä”, ”Etsi sivulta”tai” Avaa selaimessa”.

kehittäjänä voit lisätä ja muokata enintään viittä valikkokohtaa, jotka ilmestyvät kuvakerivin ja jalkakohteiden väliin.

valikkokohtaa lisätään kutsumalla CustomTabsIntent.Builder#addMenuItem otsikolla ja PendingIntent, että selain soittaa puolestasi, kun käyttäjä napauttaa kohteen ohitetaan parametreina.

Configure custom enter and exit animations #

monet Android-sovellukset käyttävät custom View Entrance-ja Exit-animaatioita siirryttäessä toimintojen välillä Androidissa. Custom välilehdet ei ole erilainen, voit muuttaa sisäänkäynti ja poistu (kun käyttäjä painaa takaisin) animaatioita pitää ne yhdenmukaisina muun sovelluksen.

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

lämmitä selainta niin, että sivut latautuvat nopeammin #

oletuksena, kun CustomTabsIntent#launchUrl kutsutaan, se pyörittää selainta ja käynnistää URL-osoitteen. Tämä voi viedä arvokasta aikaa ja vaikuttaa tasaisuuden hahmottamiseen.

uskomme, että käyttäjät vaativat lähes välitöntä kokemusta, joten olemme tarjonneet palvelun, johon sovelluksesi voi muodostaa yhteyden ja käskeä selainta ja sen alkuperäisiä osia lämpenemään. Mukautetut välilehdet tarjoavat myös mahdollisuuden sinulle, Kehittäjä kertoa selaimelle todennäköinen joukko web-sivuja käyttäjä vierailee. Tämän jälkeen selaimet voivat suorittaa:

  • DNS-esiresoluution pääalueesta
  • DNS-esiresoluution todennäköisimmistä aliresursseista
  • esiresoluution kohteeseen mukaan lukien HTTPS/TLS-neuvottelu.

prosessi selaimen lämmittämiseksi on seuraava:

  • käytä CustomTabsClient#bindCustomTabsService yhteyden muodostamiseen palveluun.
  • kun palvelu on yhdistetty, soita CustomTabsClient#warmup käynnistääksesi selaimen kulissien takana.
  • Soita CustomTabsClient#newSession Luo uusi istunto. Tätä istuntoa käytetään kaikkiin API: n pyyntöihin.
  • liittäkää valinnaisesti CustomTabsCallback parametriksi uutta istuntoa luotaessa, jotta tiedätte sivun ladatun.
  • kerro selaimelle, mitkä sivut käyttäjä todennäköisesti lataa CustomTabsSession#mayLaunchUrl
  • Soita CustomTabsIntent.Builder rakentaja ohittaa luodun CustomTabsSession parametrina.

Yhdistä Custom Tabs-palveluun #

CustomTabsClient#bindCustomTabsService – menetelmä poistaa mukautettuun Tabs-palveluun yhdistämisen monimutkaisuuden.

Luo luokka, joka ulottuu CustomTabsServiceConnection ja käytä onCustomTabsServiceConnected saadaksesi instanssin CustomTabsClient. Tätä instanssia tarvitaan seuraavissa vaiheissa.

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

lämmitä Selainprosessi #

boolean warmup(long flags)

lämmittää selainprosessia ja lataa natiivikirjastoja. Lämmittely on asynkroninen, palautusarvo ilmaisee, onko pyyntö hyväksytty. Useat onnistuneet puhelut myös palaavat true.

palauttaa true jos onnistuu.

Luo uusi välilehtisessio #

boolean newSession(CustomTabsCallback callback)

istuntoa käytetään myöhemmissä kutsuissa yhdistämään mayLaunchUrl-puhelu, CustomTabsIntent ja luotu välilehti toisiinsa. Tässä esitetty takaisinsoitto liittyy luotuun istuntoon. Kaikki luodun istunnon päivitykset (Katso mukautetut välilehdet Callback alla) vastaanotetaan myös tämän takaisinsoiton kautta. Palauttaa, onko istunto luotu onnistuneesti. Useita puheluita, joilla on sama CustomTabsCallback tai nolla-arvo, palauttaa false.

kerro selaimelle, mitä URL-osoitteita käyttäjä todennäköisesti avaa #

boolean mayLaunchUrl(Uri url, Bundle extras, List<Bundle> otherLikelyBundles)

Tämä Customtabssion menetelmä kertoo selaimelle todennäköisen tulevan navigoinnin URL-osoitteeseen. Menetelmää warmup() tulisi kutsua ensimmäiseksi parhaaksi käytännöksi. Todennäköisin URL on määritettävä ensin. Valinnaisesti voidaan toimittaa luettelo muista todennäköisistä URL-osoitteista. Niitä pidetään epätodennäköisempinä kuin ensimmäistä, ja ne on lajiteltava alenevaan prioriteettijärjestykseen. Nämä ylimääräiset URL-osoitteet voidaan jättää huomiotta. Kaikki aiemmat puhelut tähän menetelmään riistetään. Palauttaa, onko operaatio suoritettu onnistuneesti.

Custom Tabs Connection Callback #

void onNavigationEvent(int navigationEvent, Bundle extras)

kutsutaan, kun navigointitapahtuma tapahtuu mukautetussa välilehdessä. navigationEvent int on yksi 6 arvosta, jotka määrittelevät sivun tilan. Katso lisätietoja alta.

/**
* 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;

mitä tapahtuu, jos käyttäjällä ei ole omia välilehtiä tukevaa selainta asennettuna? #

Custom Tabs on tuettu useimmissa Android-selaimissa. Kuitenkin, koska se käyttää ACTION_VIEW Intent with key Extras to custom UI se avautuu järjestelmäselaimessa tai käyttäjän oletusselaimessa, jos mukautettuja välilehtiä ei tueta.

jos käyttäjällä on mukautettu välilehti tukeva selain asennettuna ja se on oletusselain, se poimii automaattisesti Ekstrat ja esittää räätälöidyn käyttöliittymän.

Miten voin tarkistaa, onko Android-laitteessa selain, joka tukee mukautettuja välilehtiä? #

PackageManager

on mahdollista tiedustella Android-laitteesta sovelluksia, jotka pystyvät käsittelemään mukautettuja välilehtiä. Kyselemme sovelluksia, jotka pystyvät käsittelemäänhttpIntents, tarkista sitten, jos nämä sovellukset ilmoittavat myös tukea Custom Tabs palvelu:

/**
* 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 on ottanut käyttöön pakettivisibliteettimuutokset. Jos Android-sovelluksesi tähtää API-tasolle 30 tai sitä korkeammalle, tarvitaan queries section to AndroidManifest.xml, muuten yllä oleva koodinpätkä ei palauta tuloksia:

<queries>
<intent>
<action android:name=
"android.support.customtabs.action.CustomTabsService" />
</intent>
</queries>

Vastaa

Sähköpostiosoitettasi ei julkaista.