launching the browser is a heavy context switch that isn't customizable, 

while WebViews don't share state with the browser and add maintenance overhead.

이런 단점들을 해결하기 위해 나온게 Chrome Custom Tab이다.


웹뷰와 CCT 중 뭘 써야할지 감이 잘 안올 때는,

https://stackoverflow.com/questions/42689996/webview-vs-chrome-custom-tab


간단하게 쓸 때.

launchUrl만 호출해도 된다.

```kt

val builder = CustomTabsIntent.Builder()

val customTabsIntent = builder.build()

customTabsIntent.launchUrl(context, uri)

```


속도를 좀 더 빠르게 하고 싶다? warm up을 하기 위해 bind를 사용하자.

https://developer.chrome.com/multidevice/android/customtabs#warm-up%20chrome%20to%20make%20pages%20load%20faster


CCT가 종료되면 이전 Activity의 onResume으로 들어온다. 그래서 따로 콜백은 안써도 됨.


주의 사항

```

Activity com.tistory.umbum.github_issue_widget_app.LoginActivity has leaked ServiceConnection com.tistory.umbum.github_issue_widget_app.helper.CustomTabsHelperKt$openCustomTab$connection$1@ef19e01 that was originally bound here

```

이런 에러가 뜨는건,

```kt

CustomTabsClient.bindCustomTabsService(context, CUSTOM_TAB_PACKAGE_NAME, connection)

```

이렇게 bind해놓은 상태에서 다시 bind를 해버리면 발생한다.

onDestroy에서 unbind해주어야 함. 그래서 mClient, mConnection 둘 다 멤버 변수로 저장해 두어야 한다.

```kt

activity.unbindService(mConnection)

```


참고 자료

https://developer.chrome.com/multidevice/android/customtabs : best practices, 왜 bind를 해야 하는지 등