Ghid de implementare

un exemplu complet este disponibil în aplicația GitHub sample. Acesta conține clase reutilizabile pentru a personaliza UI, conectați la serviciul de fundal, și se ocupe de ciclul de viață al aplicației și activitatea fila Personalizat.

dacă urmați îndrumările din această pagină, veți putea crea o integrare excelentă.

primul pas pentru integrarea filelor personalizate este adăugarea Bibliotecii browserului AndroidX la proiectul dvs. Deschideți fișierul app/build.gradle și adăugați biblioteca browserului la secțiunea dependențe.

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

odată ce Biblioteca browserului este adăugată la proiectul dvs., există două seturi de personalizări posibile:

  • personalizarea UI și interacțiunea cu filele personalizate.
  • făcând încărcarea paginii mai rapidă și menținând aplicația în viață.

personalizările UI se fac folosindCustomTabsIntent șiCustomTabsIntent.Builder clase; îmbunătățirile de performanță sunt obținute prin utilizarea CustomTabsClient pentru a vă conecta la Serviciul file personalizate, încălziți browserul și anunțați-l Ce adrese URL vor fi deschise.

deschiderea unei file personalizate #

aCustomTabsIntent.Builder poate fi utilizată pentru a configura o filă personalizată. Odată gata, apelați CustomTabsIntent.Builder.buildpentru a crea unCustomTabsIntentși lansați Url-ul dorit cuCustomTabsIntent.launchUrl.

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

configurați culoarea barei de adrese #

unul dintre cele mai importante (și mai simple de implementat) aspecte ale filelor personalizate este posibilitatea de a schimba culoarea barei de adrese pentru a fi în concordanță cu tema aplicației.fragmentul de mai jos modifică culoarea de fundal pentru bara de adrese. colorInt este un int care specifică un Color.

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

configurați un buton de acțiune personalizat #

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

captură de ecran a butonului de acțiune din aplicația Tumblr

în calitate de dezvoltator al aplicației dvs., aveți control deplin asupra butonului de acțiune prezentat utilizatorilor dvs. în fila browser.

în majoritatea cazurilor, aceasta va fi o acțiune principală, cum ar fi partajarea sau o altă activitate comună pe care utilizatorii dvs. o vor efectua.

butonul de acțiune este reprezentat ca un pachet cu o pictogramă a butonului de acțiune și unPendingIntent care va fi apelat de browser atunci când utilizatorul dvs. atinge butonul de acțiune. Pictograma este currenlty 24dp în înălțime și 24-48 dp în lățime.

poate fi personalizat apelând CustomTabsIntentBuilder#setActionButton:

  • icon este un Bitmap pentru a fi utilizat ca sursă de imagine pentru butonul de acțiune.
  • description este unString fi folosit ca o descriere accesibilă pentru buton.
  • pendingIntent este unPendingIntent pentru a lansa atunci când butonul de acțiune sau elementul de meniu a fost atins. Browserul va apela PendingIntent#send la robinete după adăugarea adresei url ca date. Aplicația client poate apela Intent#getDataString pentru a obține adresa url.
  • tint este un boolean care definește dacă butonul de acțiune ar trebui să fie nuanțat.

configurați un meniu personalizat #

builder.addMenuItem(menuItemTitle, menuItemPendingIntent);

captură de ecran a meniului din aplicația Twitter

browserul are un meniu cuprinzător de acțiuni pe care utilizatorii le vor efectua frecvent în interiorul unui browser, cu toate acestea este posibil să nu fie relevante pentru contextul aplicației dvs.

filele personalizate vor avea un set de acțiuni implicite furnizate de browser. Aceste acțiuni pot include elemente precum” redirecționare”,” informații despre pagină”,” Reîmprospătare”,” căutare în pagină „sau”Deschidere în Browser”.

în calitate de dezvoltator, puteți adăuga și personaliza până la cinci elemente de meniu care vor apărea între rândul pictogramei și elementele piciorului.

se adaugă un element de meniu apelândCustomTabsIntent.Builder#addMenuItem cu titlu și unPendingIntent acel browser va apela în numele dvs. atunci când utilizatorul atinge elementul sunt transmise ca parametri.

configurați animațiile de intrare și ieșire personalizate #

multe aplicații Android utilizează animații de intrare și ieșire personalizate atunci când trec între activități pe Android. File personalizate nu este diferit, puteți schimba intrarea și ieșirea (atunci când utilizatorul apasă înapoi) animații pentru a le menține în concordanță cu restul cererii dumneavoastră.

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

încălziți browserul pentru a face paginile să se încarce mai repede #

în mod implicit, cândCustomTabsIntent#launchUrl este apelat, acesta va roti browserul și va lansa adresa URL. Acest lucru poate dura timp prețios și impact asupra percepției netezimii.

credem că utilizatorii solicită o experiență aproape instantanee, așa că am furnizat un serviciu la care aplicația dvs. se poate conecta și spune browserului și componentelor sale native să se încălzească. Filele personalizate oferă, de asemenea, posibilitatea pentru dvs., dezvoltatorul de a spune browserului setul probabil de pagini web pe care utilizatorul le va vizita. Browserele vor putea apoi să efectueze:

  • DNS pre-rezoluție a domeniului principal
  • DNS pre-rezoluție a celor mai probabile sub-resurse
  • pre-conexiune la destinație, inclusiv negocierea HTTPS / TLS.

procesul de încălzire a browserului este următorul:

  • utilizați CustomTabsClient#bindCustomTabsService pentru a vă conecta la serviciu.
  • odată ce serviciul este conectat, apelați CustomTabsClient#warmup pentru a porni browserul din culise.
  • apel CustomTabsClient#newSession pentru a crea o nouă sesiune. Această sesiune este utilizată pentru toate solicitările către API.
  • opțional, atașați unCustomTabsCallback ca parametru atunci când creați o nouă sesiune, astfel încât să știți că o pagină a fost încărcată.
  • spuneți browserului ce pagini este probabil să încarce utilizatorul cuCustomTabsSession#mayLaunchUrl
  • apelațiCustomTabsIntent.Builder constructorul care treceCustomTabsSession ca parametru.

Conectați-vă la Serviciul file personalizate #

metodaCustomTabsClient#bindCustomTabsService elimină complexitatea conectării la Serviciul file personalizate.

creați o clasă care extindeCustomTabsServiceConnection și utilizaționCustomTabsServiceConnected pentru a obține o instanță aCustomTabsClient. Această instanță va fi necesară în următorii pași.

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

încălziți procesul browserului #

boolean warmup(long flags)

încălzește procesul browserului și încarcă bibliotecile native. Warmup este asincron, valoarea returnată indică dacă cererea a fost acceptată. Mai multe apeluri de succes va reveni, de asemenea, adevărat.

returneazătrue dacă are succes.

creați o nouă filă sesiune #

boolean newSession(CustomTabsCallback callback)

sesiunea este utilizată în apelurile ulterioare pentru a lega apelul mayLaunchUrl, CustomTabsIntent și fila generate între ele. Apelul invers furnizat aici este asociat cu sesiunea creată. Orice actualizări pentru sesiunea creată (a se vedea file personalizate Callback de mai jos) este, de asemenea, primit prin acest apel invers. Returnează dacă o sesiune a fost creată cu succes. Mai multe apeluri cu același CustomTabsCallback sau o valoare nulă va reveni false.

spuneți browserului ce URL-uri este probabil să deschidă utilizatorul #

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

această metodă CustomTabsSession spune browserului despre o navigare viitoare probabilă către o adresă URL. Metoda warmup() ar trebui să fie numită mai întâi ca o bună practică. Adresa URL cea mai probabilă trebuie specificată mai întâi. Opțional, poate fi furnizată o listă cu alte adrese URL probabile. Acestea sunt tratate ca fiind mai puțin probabile decât prima și trebuie sortate în ordinea priorității descrescătoare. Aceste adrese URL suplimentare pot fi ignorate. Toate apelurile anterioare la această metodă vor fi deprioritizate. Returnează dacă operațiunea a fost finalizată cu succes.

file personalizate conexiune apel invers #

void onNavigationEvent(int navigationEvent, Bundle extras)

va fi apelat atunci când un eveniment de navigare se întâmplă în fila Personalizat. navigationEvent int este una dintre cele 6 valori care definesc starea paginii în care se află. A se vedea mai jos pentru mai multe informații.

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

ce se întâmplă dacă utilizatorul nu are instalat un browser care acceptă file personalizate? #

filele personalizate sunt acceptate de majoritatea browserelor Android. Cu toate acestea, deoarece folosește un ACTION_VIEW intenție cu Extras cheie pentru a personaliza interfața de utilizare, se va deschide în browserul de sistem sau în browserul implicit al utilizatorului dacă filele personalizate nu sunt acceptate.

în cazul în care utilizatorul are un browser care acceptă Tab personalizat instalat și este browser-ul implicit, se va ridica automat figuranti și să prezinte o interfață personalizată.

Cum pot verifica dacă dispozitivul Android are un browser care acceptă fila personalizată? #

este posibil să utilizațiPackageManager pentru a interoga dispozitivul Android pentru aplicații care pot gestiona filele personalizate. Interogăm pentru aplicații care sunt capabile să se ocupe dehttp intenții, apoi verificați dacă aceste aplicații declară, de asemenea, suport pentru serviciul file personalizate:

/**
* 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 a introdus modificări pachet viziblity. Dacă aplicația Android vizează nivelul API 30 sau mai sus, este necesară adăugarea unei secțiuni queries la AndroidManifest.xml, altfel fragmentul de cod de mai sus nu va returna rezultate:

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

Lasă un răspuns

Adresa ta de email nu va fi publicată.