준비 및 프리패치: 맞춤 탭 서비스 사용

이 가이드의 세 번째 부분에서는 맞춤 탭 서비스와 애플리케이션에서 맞춤 탭 서비스를 사용하여 더 나은 사용자 환경을 제공하는 이유에 대해 중점적으로 설명합니다.

  • 외부 콘텐츠 즉시 열기: warmup()를 사용하면 사용자가 링크를 클릭하기 전에도 백그라운드에서 브라우저 프로세스가 시작되며 링크를 열 때 최대 700밀리초를 절약할 수 있습니다. mayLaunchUrl()는 페이지를 미리 가져옵니다. 두 API를 함께 사용하면 페이지를 즉시 로드하여 맞춤 탭 통합의 사용자 환경이 크게 개선됩니다.
  • 최소화된 맞춤 탭 처리 개선: 맞춤 탭 서비스에 연결하고 맞춤 탭을 실행할 때 동일한 CustomTabSession를 사용하면 Chrome에서 새 탭을 실행하기 전에 이전에 최소화된 맞춤 탭을 삭제하여 더욱 일관된 사용자 환경을 제공할 수 있습니다.

필요한 단계는 다음과 같습니다.

  1. CustomTabsClient.getPackageName(...)를 사용하여 기본 브라우저에서 맞춤 탭을 지원하는지 확인합니다. 그렇다면 CustomTabsClient.bindCustomTabsService()를 사용하여 CustomTabsService에 바인딩합니다.
  2. CustomTabsService에 연결되면 CustomTabsServiceConnection.onCustomTabsServiceConnected() 콜백에서 다음을 실행합니다.

    a. CustomTabsClient.warmup()를 사용하여 브라우저 프로세스를 준비합니다. b. CustomTabsClient.newSession()를 사용하여 새 CustomTabsSession를 만듭니다.

  3. 원하는 경우 CustomTabsSession.mayLaunchUrl()를 사용하여 사용자가 방문할 가능성이 높은 웹페이지를 미리 가져옵니다.

  4. 새 맞춤 탭을 실행할 때 new CustomTabsIntent.Builder(session) 생성자를 사용하여 CustomTabsSessionCustomTabsIntent.Builder에 전달합니다.

앱이 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의 경우 Android 애플리케이션이 URL을 처리할 수 있습니다. 예를 들어 사용자가 Facebook 앱을 설치한 상태에서 Facebook 게시물 링크를 클릭하는 경우 일반적으로 브라우저보다는 Facebook 앱에서 링크를 여는 것을 선호합니다.

기본적으로 맞춤 탭은 각 Android 애플리케이션이 설치된 경우 링크를 엽니다. 하지만 CustomTabsServiceConnection가 설정되면 이 동작이 중단되고 대신 모든 URL이 맞춤 탭에서 열립니다. 사용자 환경을 개선하려면 다음 코드를 사용하여 이 동작을 다시 사용 설정하는 것이 좋습니다.

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

다음 단계: 맞춤 탭 환경의 크기를 조절하는 방법 알아보기