průvodce implementací

kompletní příklad je k dispozici v ukázkové aplikaci GitHub. Obsahuje znovu použitelné třídy pro přizpůsobení uživatelského rozhraní, připojení ke Službě na pozadí a zpracování životního cyklu aplikace i činnosti vlastní karty.

Pokud budete postupovat podle pokynů z této stránky, budete moci vytvořit skvělou integraci.

prvním krokem pro integraci vlastních karet je přidání knihovny prohlížeče AndroidX do vašeho projektu. Otevřete soubor app/build.gradle a přidejte knihovnu prohlížeče do sekce závislostí.

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

Jakmile Prohlížeč Knihovna je přidán do projektu jsou dvě sady možné úpravy:

  • Přizpůsobení UI a interakci s vlastní záložky.
  • zrychluje načítání stránky a udržuje aplikaci naživu.

přizpůsobení uživatelského rozhraní se provádí pomocí tříd CustomTabsIntent a CustomTabsIntent.Builder ; zlepšení výkonu je dosaženo použitím CustomTabsClient pro připojení ke službě Custom Tabs, zahřátí prohlížeče a informování, které adresy URL budou otevřeny.

otevření vlastní karty #

a CustomTabsIntent.Builder lze použít ke konfiguraci vlastní karty. Jakmile je připraven, call CustomTabsIntent.Builder.build vytvořit CustomTabsIntent a spusťte požadovanou adresu Url pomocí CustomTabsIntent.launchUrl.

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

Nastavit barvu adresního řádku #

Jeden z nejdůležitější (a nejjednodušší na implementaci) aspekty Vlastní Karty je možnost změnit barvu panelu adresa musí být v souladu s vaší aplikace téma.

níže uvedený úryvek změní barvu pozadí adresního řádku. colorInt je int, který určuje Color.

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

Konfigurovat vlastní tlačítko akce #

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

Screenshot Tlačítko Akce v Tumblr aplikace

Jako vývojář aplikace, máte plnou kontrolu nad Tlačítko Akce, které jsou prezentovány uživatelům uvnitř prohlížeče tab.

ve většině případů se jedná o primární akci, jako je sdílení, nebo jinou běžnou aktivitu, kterou budou uživatelé provádět.

tlačítko Akce je reprezentováno jako balíček s ikonou tlačítka akce a PendingIntent, který bude vyvolán prohlížečem, když uživatel stiskne tlačítko akce. Ikona je currently 24dp na výšku a 24-48 dp na šířku.

To může být přizpůsoben zavoláním CustomTabsIntentBuilder#setActionButton:

  • iconBitmap být použit jako zdroj obrazu pro tlačítko akce.
  • description je String být použit jako přístupný popis tlačítka.
  • pendingIntent je PendingIntent pro spuštění při klepnutí na tlačítko akce nebo položku nabídky. Prohlížeč bude volat PendingIntent#send po klepnutí po přidání adresy url jako data. Klientská aplikace může volat Intent#getDataString pro získání adresy url.
  • tint je boolean, který definuje, zda má být tlačítko Akce zabarveno.

Konfigurovat vlastní menu #

builder.addMenuItem(menuItemTitle, menuItemPendingIntent);

Screenshot z menu na Twitter aplikace

prohlížeč má komplexní nabídka akcí, které budou uživatelé provádět často uvnitř prohlížeče, však, že nemusí být relevantní pro vaši aplikaci kontextu.

vlastní karty budou mít sadu výchozích akcí poskytovaných prohlížečem. Tyto akce mohou zahrnovat položky jako „vpřed“, „informace o stránce“, „Obnovit“, „najít na Stránce „nebo“ otevřít v prohlížeči“.

jako vývojář můžete přidat a přizpůsobit až pět položek nabídky, které se objeví mezi řádkem ikon a položkami nohou.

položka menu je přidána voláním CustomTabsIntent.Builder#addMenuItem s název a PendingIntent prohlížeč vám zavolal tvým jménem, když uživatel poklepe položky jsou předány jako parametry.

nakonfigurujte vlastní animace pro vstup a výstup #

mnoho aplikací pro Android používá při přechodu mezi aktivitami v systému Android Vlastní Animace pro vstup a výstup. Vlastní karty se nijak neliší, můžete změnit vstup a výstup (když uživatel stiskne zpět) animace, aby byly v souladu se zbytkem vaší aplikace.

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

Warm up prohlížeče, aby se stránky načítají rychleji #

ve výchozím nastavení, když CustomTabsIntent#launchUrl říká, že bude točit do prohlížeče a spustit URL. To může zabrat drahocenný čas a ovlivnit vnímání hladkosti.

Jsme přesvědčeni, že uživatelé poptávka téměř okamžité zkušenosti, takže jsme poskytli Služby, které vaše aplikace může připojit a řekněte prohlížeč a jeho nativní komponenty, aby se zahřál. Vlastní karty také poskytují možnost pro vás, vývojář sdělit prohlížeči pravděpodobnou sadu webových stránek, které uživatel navštíví. Prohlížeče bude pak moci provést:

  • DNS pre-usnesení z hlavní domény
  • DNS pre-usnesení největší pravděpodobností sub-zdrojů
  • Pre-připojení na místo určení včetně HTTPS/TLS vyjednávání.

proces zahřívání prohlížeče je následující:

  • použijte CustomTabsClient#bindCustomTabsService pro připojení ke službě.
  • jakmile je služba připojena, zavolejte CustomTabsClient#warmup a spusťte prohlížeč v zákulisí.
  • volání CustomTabsClient#newSession pro vytvoření nové relace. Tato relace se používá pro všechny požadavky na API.
  • volitelně připojte CustomTabsCallback jako parametr při vytváření nové relace, abyste věděli, že stránka byla načtena.
  • Řekněte prohlížeč stránky, které uživatel je pravděpodobné, že zatížení s CustomTabsSession#mayLaunchUrl
  • Volat CustomTabsIntent.Builder předávání konstruktorem vytvořený CustomTabsSession jako parametr.

Připojte se ke službě Custom Tabs #

metoda CustomTabsClient#bindCustomTabsService odstraňuje složitost připojení ke službě Custom Tabs.

Vytvořte třídu, která rozšiřuje CustomTabsServiceConnectiononCustomTabsServiceConnected instance CustomTabsClient. Tato instance bude zapotřebí v dalších krocích.

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

Warm up Prohlížeče Proces #

boolean warmup(long flags)

Ohřívá procesu prohlížeče a načte nativní knihovny. Warmup je asynchronní, návratová hodnota označuje, zda byl požadavek přijat. Více úspěšných hovorů se také vrátí true.

vrátí true pokud bude úspěšný.

Vytvořit novou záložku session #

boolean newSession(CustomTabsCallback callback)

Relace se používá v následné volání na odkaz mayLaunchUrl hovor, CustomTabsIntent a tab generovány k sobě navzájem. Zde uvedené zpětné volání je spojeno s vytvořenou relací. Veškeré aktualizace vytvořené relace (viz vlastní karty Callback níže) jsou také přijímány prostřednictvím tohoto callback. Vrátí, zda byla relace úspěšně vytvořena. Více hovorů se stejnou CustomTabsCallback nebo null hodnota vrátí false.

řekněte prohlížeči, jaké adresy URL uživatel pravděpodobně otevře #

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

tato metoda CustomTabsSession informuje prohlížeč o pravděpodobné budoucí navigaci na adresu URL. Metoda warmup() by měla být nazvána jako nejlepší praxe. Nejpravděpodobnější adresa URL musí být zadána jako první. Volitelně lze poskytnout seznam dalších pravděpodobných adres URL. Jsou považovány za méně pravděpodobné než první, a musí být seřazeny v sestupném pořadí priorit. Tyto další adresy URL mohou být ignorovány. Všechna předchozí volání k této metodě budou deprioritizována. Vrátí, zda byla operace úspěšně dokončena.

Vlastní Karty, Připojení Zpětného volání #

void onNavigationEvent(int navigationEvent, Bundle extras)

Bude volána, když navigační událost se stane v záložce vlastní. navigationEvent int je jednou ze 6 hodnot, které definují stav stránky. Další informace naleznete níže.

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

co se stane, když uživatel nemá nainstalován prohlížeč, který podporuje vlastní karty? #

vlastní karty podporuje většina prohlížečů Android. Nicméně, protože používá ACTION_VIEW záměr s klíčovými doplňky pro přizpůsobení uživatelského rozhraní, otevře se v systémovém prohlížeči nebo výchozím prohlížeči uživatele, pokud vlastní karty nejsou podporovány.

pokud má uživatel nainstalován prohlížeč, který podporuje vlastní kartu a je to výchozí prohlížeč, automaticky vyzvedne doplňky a představí přizpůsobené uživatelské rozhraní.

Jak mohu zkontrolovat, zda má zařízení Android prohlížeč, který podporuje vlastní kartu? #

je možné použít PackageManager k dotazu na zařízení Android pro aplikace, které zvládnou vlastní karty. Máme dotaz pro aplikace, které jsou schopni zvládnout http Záměry, pak zkontrolujte, zda tyto aplikace také deklarovat podporu Vlastní Karty Služby:

/**
* 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 zavedl změny viditelnosti balíčku. Pokud váš Android je cílení API na úrovni 30 nebo vyšší, přidávat queries oddíl AndroidManifest.xml je potřeba, jinak kódu výše nevrátí výsledky:

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.