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

이 가이드의 세 번째 부분에서는 warmup()를 통해 브라우저 시작 속도를 높이고 mayLaunchUrl()를 통해 웹페이지를 미리 가져오는 방법을 중점적으로 다룹니다. 브라우저 프로세스를 준비하면 링크를 열 때 최대 700밀리초를 절약할 수 있습니다. mayLaunchUrl를 통해 콘텐츠를 사전 렌더링하면 외부 콘텐츠가 즉시 열립니다. 두 API를 함께 사용하면 맞춤 탭 통합의 사용자 환경을 크게 개선할 수 있으므로 적극 권장됩니다.

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

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

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

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

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