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

Третья часть этого руководства посвящена Службе пользовательских вкладок и тому, почему ее использование в вашем приложении улучшает взаимодействие с пользователем:

  • Мгновенно открывайте внешний контент: использование warmup() заставляет процесс браузера запускаться в фоновом режиме еще до того, как пользователь нажмет на ссылку, и может сэкономить до 700 мс при открытии ссылки. mayLaunchUrl() предварительно загружает страницы. Совместное использование обоих API позволяет страницам загружаться мгновенно, что значительно улучшает взаимодействие с пользователем при интеграции пользовательских вкладок.
  • Улучшенная обработка свернутых пользовательских вкладок : подключившись к службе пользовательских вкладок и используя тот же CustomTabSession при запуске пользовательской вкладки, Chrome сможет удалить ранее свернутые пользовательские вкладки перед запуском новой вкладки, обеспечивая более единообразный пользовательский интерфейс.

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

  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-адреса могут обрабатываться приложениями Android. Например, если у пользователя установлено приложение Facebook и он нажимает ссылку на публикацию Facebook, он обычно предпочитает, чтобы ссылка открывалась в приложении Facebook, а не в браузере.

По умолчанию «Пользовательские вкладки» открывают ссылки в соответствующем приложении Android, если оно установлено. Однако после установки CustomTabsServiceConnection это поведение перестает работать, и вместо этого все URL-адреса открываются в пользовательских вкладках. Для улучшения взаимодействия с пользователем мы рекомендуем повторно включить это поведение, используя следующий код:

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

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