Implementeringsguide

ett komplett exempel finns tillgängligt i GitHub-exempelapplikationen. Den innehåller återanvändbara klasser för att anpassa användargränssnittet, ansluta till bakgrundstjänsten och hantera livscykeln för både applikationen och den anpassade flikaktiviteten.

om du följer vägledningen från den här sidan kommer du att kunna skapa en bra integration.

det första steget för en anpassad Flikintegration är att lägga till AndroidX-Webbläsarbiblioteket i ditt projekt. Öppna filen app/build.gradle och Lägg till webbläsarbiblioteket i avsnittet beroenden.

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

när Webbläsarbiblioteket har lagts till i ditt projekt finns det två uppsättningar möjliga anpassningar:

  • anpassa användargränssnittet och interaktion med de anpassade flikarna.
  • att sidan laddas snabbare och hålla applikationen vid liv.

UI-anpassningarna görs medCustomTabsIntent ochCustomTabsIntent.Builder klasserna; prestandaförbättringarna uppnås genom att använda CustomTabsClient för att ansluta till tjänsten Custom Tabs, värma upp webbläsaren och låt den veta vilka webbadresser som öppnas.

öppna en anpassad flik #

A CustomTabsIntent.Builder kan användas för att konfigurera en anpassad flik. När du är klar, ring CustomTabsIntent.Builder.build för att skapa ett CustomTabsIntent och starta önskad 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));

konfigurera färgen på adressfältet #

en av de viktigaste (och enklaste att implementera) aspekterna av anpassade flikar är möjligheten för dig att ändra färgen på adressfältet för att överensstämma med appens tema.

nedanstående utdrag ändrar bakgrundsfärgen för adressfältet. colorInt är en int som anger ett Color.

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

konfigurera en anpassad åtgärdsknapp #

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

skärmdump av åtgärdsknappen i Tumblr-appen

som utvecklare av din app har du full kontroll över åtgärdsknappen som presenteras för dina användare på webbläsarfliken.

i de flesta fall kommer detta att vara en primär åtgärd som Dela eller en annan vanlig aktivitet som dina användare kommer att utföra.

åtgärdsknappen representeras som en bunt med en ikon för åtgärdsknappen och ett PendingIntent som kommer att anropas av webbläsaren när din användare träffar åtgärdsknappen. Ikonen är currenty 24dp i höjd och 24-48 dp i bredd.

det kan anpassas genom att ringa CustomTabsIntentBuilder#setActionButton:

  • icon är ett Bitmap som ska användas som bildkälla för åtgärdsknappen.
  • description är en String användas som en tillgänglig beskrivning för knappen.
  • pendingIntent är ett PendingIntent för att starta när åtgärdsknappen eller menyalternativet tappades. Webbläsaren kommer att ringa PendingIntent#send på kranar efter att ha lagt till webbadressen som data. Klientappen kan ringa Intent#getDataString för att få webbadressen.
  • tint är en boolesk som definierar om åtgärdsknappen ska tonas.

konfigurera en anpassad meny #

builder.addMenuItem(menuItemTitle, menuItemPendingIntent);

skärmdump av menyn på Twitter-appen

webbläsaren har en omfattande meny med åtgärder som användare kommer att utföra ofta i en webbläsare, men de kanske inte är relevanta för din applikationskontext.

anpassade flikar kommer att ha en uppsättning standardåtgärder som tillhandahålls av webbläsaren. Dessa åtgärder kan innehålla objekt som” framåt”,” Sidinformation”,” Uppdatera”,” Sök på sidan ”eller”öppna i webbläsaren”.

som utvecklare kan du lägga till och anpassa upp till fem menyalternativ som kommer att visas mellan ikonraden och fotobjekten.

ett menyalternativ läggs till genom att ringa CustomTabsIntent.Builder#addMenuItem med titel och ett PendingIntent den webbläsaren kommer att ringa för din räkning när användaren trycker på objektet skickas som parametrar.

konfigurera anpassade enter-och exit-animationer #

många Android-applikationer använder anpassade ingångs-och Utgångsanimationer vid övergång mellan aktiviteter på Android. Anpassade flikar är inte annorlunda, Du kan ändra ingång och utgång (när användaren trycker tillbaka) animationer för att hålla dem förenliga med resten av din ansökan.

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

värm upp webbläsaren så att sidorna laddas snabbare #

som standard, närCustomTabsIntent#launchUrl kallas, kommer den att snurra upp webbläsaren och starta webbadressen. Detta kan ta dyrbar tid och påverka uppfattningen om jämnhet.

Vi tror att användarna kräver en nästan omedelbar upplevelse, så vi har tillhandahållit en tjänst som din app kan ansluta till och berätta för webbläsaren och dess inbyggda komponenter att värma upp. Anpassade flikar ger också möjlighet för dig, utvecklaren att berätta webbläsaren sannolikt uppsättning webbsidor användaren kommer att besöka. Webbläsare kommer då att kunna utföra:

  • DNS förupplösning av huvuddomänen
  • DNS förupplösning av de mest sannolika delresurserna
  • föranslutning till destinationen inklusive HTTPS/TLS-förhandlingar.

processen för att värma upp webbläsaren är som följer:

  • använd CustomTabsClient#bindCustomTabsService för att ansluta till tjänsten.
  • när tjänsten är ansluten, Ring CustomTabsClient#warmup för att starta webbläsaren bakom kulisserna.
  • Ring CustomTabsClient#newSession för att skapa en ny session. Denna session används för alla förfrågningar till API.
  • bifoga eventuellt ett CustomTabsCallback som en parameter när du skapar en ny session, så att du vet att en sida laddades.
  • berätta för webbläsaren vilka sidor Användaren sannolikt kommer att ladda med CustomTabsSession#mayLaunchUrl
  • Ring CustomTabsIntent.Builder konstruktören som passerar den skapade CustomTabsSession som en parameter.

Anslut till tjänsten anpassade flikar #

metoden CustomTabsClient#bindCustomTabsService tar bort komplexiteten att ansluta till tjänsten anpassade flikar.

skapa en klass som utökar CustomTabsServiceConnection och använd onCustomTabsServiceConnected för att få en instans av CustomTabsClient. Denna instans kommer att behövas i nästa steg.

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

värm upp Webbläsarprocessen #

boolean warmup(long flags)

värmer upp webbläsarprocessen och laddar de inbyggda biblioteken. Warmup är asynkron, returvärdet anger om begäran har accepterats. Flera framgångsrika samtal kommer också att returnera true.

returnerar true om det lyckas.

skapa en ny flik session #

boolean newSession(CustomTabsCallback callback)

Session används i efterföljande samtal för att länka mayLaunchUrl samtal, CustomTabsIntent och fliken genereras till varandra. Återuppringningen som tillhandahålls här är associerad med den skapade sessionen. Eventuella uppdateringar för den skapade sessionen (se anpassade flikar återuppringning nedan) tas också emot genom denna återuppringning. Returnerar om en session har skapats. Flera samtal med samma CustomTabsCallback eller ett null-värde kommer att returnera false.

berätta för webbläsaren vilka webbadresser användaren sannolikt kommer att öppna #

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

denna CustomTabsSession-metod berättar för webbläsaren om en sannolik framtida navigering till en URL. Metoden warmup() bör kallas först som en bästa praxis. Den mest sannolika webbadressen måste anges först. Eventuellt kan en lista med andra troliga webbadresser tillhandahållas. De behandlas som mindre troliga än den första och måste sorteras i minskande prioritetsordning. Dessa ytterligare webbadresser kan ignoreras. Alla tidigare samtal till den här metoden kommer att berövas. Returnerar om åtgärden har slutförts.

anpassade flikar anslutning återuppringning #

void onNavigationEvent(int navigationEvent, Bundle extras)

anropas när en navigationshändelse inträffar på fliken Anpassad. navigationEvent int är ett av 6 värden som definierar sidans tillstånd. Se nedan för mer 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;

vad händer om användaren inte har en webbläsare som stöder anpassade flikar installerade? #

anpassade flikar stöds av de flesta Android-webbläsare. Ändå, eftersom den använder en ACTION_VIEW avsikt med viktiga extrafunktioner för att anpassa användargränssnittet öppnas det i systemwebbläsaren eller användarens standardwebbläsare om anpassade flikar inte stöds.

om användaren har en webbläsare som stöder anpassad flik installerad och det är standardwebbläsaren, kommer den automatiskt att hämta extrafunktionerna och presentera ett anpassat användargränssnitt.

Hur kan jag kontrollera om Android-enheten har en webbläsare som stöder anpassad flik? #

det är möjligt att använda PackageManager för att fråga Android-enheten för applikationer som kan hantera anpassade flikar. Vi frågar efter applikationer som kan hanterahttp Intents, kontrollera sedan om dessa applikationer också förklarar stöd för tjänsten 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 infört paket visiblity förändringar. Om din Android-app är inriktad på API-nivå 30 eller högre, lägger du till ettqueries avsnitt tillAndroidManifest.xml, annars kommer kodavsnittet ovan inte att returnera resultat:

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

Lämna ett svar

Din e-postadress kommer inte publiceras.