חימום ושליפה מראש: באמצעות שירות הכרטיסיות המותאמות אישית

החלק השלישי של המדריך מתמקד בהאצת הפעלת הדפדפן באמצעות warmup() ובשליפה מראש (prefetch) של דפי אינטרנט דרך mayLaunchUrl(). חימום תהליך הדפדפן עשוי לחסוך עד 700 אלפיות השנייה בעת פתיחת קישור. כשמעבדים מראש תוכן דרך mayLaunchUrl, נוצר באופן מיידי תוכן חיצוני. השילוב של שני ממשקי ה-API יכול לשפר משמעותית את חוויית המשתמש בשילוב עם כרטיסיות מותאמות אישית, והם מומלצים מאוד.

השלבים הנדרשים הם:

  1. בודקים דרך CustomTabsClient.getPackageName(...) אם דפדפן ברירת המחדל תומך בכרטיסיות מותאמות. אם כן, צריך לחייב את CustomTabsService דרך CustomTabsClient.bindCustomTabsService().
  2. אחרי שמתחברים ל-CustomTabsService, בקריאה החוזרת CustomTabsServiceConnection.onCustomTabsServiceConnected() מבצעים את הפעולות הבאות:

    a. אפשר להפעיל חימום של תהליך הדפדפן באמצעות CustomTabsClient.warmup(). b. אפשר ליצור CustomTabsSession חדש דרך CustomTabsClient.newSession().

  3. אפשר גם לבצע שליפה מראש (prefetch) של דפי אינטרנט שהמשתמש עשוי לבקר בהם דרך CustomTabsSession.mayLaunchUrl().

  4. כשמשיקים כרטיסייה חדשה בהתאמה אישית, מעבירים את CustomTabsSession אל CustomTabsIntent.Builder דרך הבונה new CustomTabsIntent.Builder(session).

אם האפליקציה מטרגטת רמת API של Android 30, CustomTabsClient.getPackageName(...) צריך להוסיף קטע שאילתות למניפסט של Android, עם הצהרה על מסנן Intent שתואם לדפדפנים עם תמיכה בכרטיסיות מותאמות אישית.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
  …
   <queries>
        <intent>
            <action android:name="android.support.customtabs.action.CustomTabsService" />
        </intent>
    </queries>
</manifest>

הנה דוגמה מלאה של אופן ההתחברות לשירות 'כרטיסיות מותאמות אישית':

private CustomTabsClient mClient;
private CustomTabsSession mSession;

private CustomTabsServiceConnection mConnection = new CustomTabsServiceConnection() {
    @Override
    public void onCustomTabsServiceConnected(
            @NonNull ComponentName name,
            @NonNull CustomTabsClient client
    ) {
        mClient = client;
        // Warm up the browser process
        mClient.warmup(0 /* placeholder for future use */);
        // Create a new browser session
        mSession = mClient.newSession(new CustomTabsCallback());
        // Pre-render pages the user is likely to visit
        // you can do this any time while the service is connected
        mSession.mayLaunchUrl(Uri.parse("https://developers.android.com"), null, null);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mClient = null;
        mSession = null;
    }
};

private void bindCustomTabService(Context context) {
    // Check for an existing connection
    if (mClient != null) {
        // Do nothing if there is an existing service connection
        return;
    }

    // Get the default browser package name, this will be null if
    // the default browser does not provide a CustomTabsService
    String packageName = CustomTabsClient.getPackageName(context, null);
    if (packageName == null) {
        // Do nothing as service connection is not supported
        return;
    }
    CustomTabsClient.bindCustomTabsService(context, packageName, mConnection);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
…
    bindCustomTabService(this);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String url = "https://developers.android.com";
            CustomTabsIntent intent = new CustomTabsIntent.Builder(mSession)
                    .build();
            intent.launchUrl(MainActivity.this, Uri.parse(url));
        }
    });
}

פתיחת דפי אינטרנט באפליקציות מקוריות

ב-Android, ניתן לטפל בכתובות URL באמצעות אפליקציות מקוריות. לדוגמה, אם המשתמש התקין את אפליקציית Facebook ולוחץ על קישור לפוסט ב-Facebook, בדרך כלל הוא מעדיף לפתוח את הקישור באפליקציית Facebook במקום בדפדפן.

כברירת מחדל, הקטע 'כרטיסיות מותאמות אישית' פותח קישורים באפליקציה המקורית המתאימה, אם היא מותקנת. עם זאת, אחרי יצירת CustomTabsServiceConnection, ההתנהגות הזו מפסיקה לפעול ובמקום זאת כל כתובות ה-URL נפתחות בכרטיסיות בהתאמה אישית. לשיפור חוויית המשתמש, מומלץ להפעיל מחדש את ההתנהגות הזאת באמצעות הקוד הבא:

CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder()
    .setSendToExternalDefaultHandlerEnabled(true)
    .build();

השלב הבא: כך משנים את הגודל של חלונית הכרטיסיות בהתאמה אישית.