Разминка и предварительная загрузка: использование службы пользовательских вкладок

Третья часть этого руководства посвящена ускорению запуска браузера с помощью warmup() и предварительной загрузке веб-страниц с помощью mayLaunchUrl (). Прогрев процесса браузера позволяет сэкономить до 700мс при открытии ссылки. Предварительная отрисовка контента с помощью mayLaunchUrl позволяет мгновенно открыть внешний контент. Вместе оба API могут значительно улучшить взаимодействие с пользователем при интеграции пользовательских вкладок, и мы настоятельно рекомендуем их использовать.

Необходимые шаги:

  1. Проверьте через CustomTabsClient.getPackageName(...) если браузер по умолчанию поддерживает пользовательские вкладки. Если да, привяжитесь к CustomTabsService через CustomTabsClient.bindCustomTabsService() .
  2. После подключения к CustomTabsService в обратном вызове CustomTabsServiceConnection.onCustomTabsServiceConnected() выполните:

    а. Разогрейте процесс браузера с помощью CustomTabsClient.warmup() . б. Создайте новый CustomTabsSession с помощью CustomTabsClient.newSession() .

  3. При желании можно предварительно загрузить веб-страницы, которые пользователь, скорее всего, посетит, с помощью CustomTabsSession.mayLaunchUrl() .

  4. При запуске новой настраиваемой вкладки передайте CustomTabsSession в CustomTabsIntent.Builder через конструктор new CustomTabsIntent.Builder(session) .

Если ваше приложение предназначено для Android API уровня 30 , CustomTabsClient.getPackageName(...) требует, чтобы вы добавили раздел запросов в манифест Android, объявив фильтр намерений, который соответствует браузерам с поддержкой пользовательских вкладок.

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

Далее: узнайте, как изменить размер пользовательских вкладок .