Chrome Custom Tabs redirect to Android app will close the app Chrome Custom Tabs redirect to Android app will close the app google-chrome google-chrome

Chrome Custom Tabs redirect to Android app will close the app


I've also observed my Android app unexpectedly background after server-side 302 redirection to a custom scheme, and observed expected handling from stand-alone Chrome and manually triggered redirection in the client.

I was able to "fix" the issue by calling the warmup function before loading the url that redirects.

In other words, this works:

void launchTab(Context context, Uri uri){    final CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {        @Override        public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient client) {            final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();            final CustomTabsIntent intent = builder.build();            client.warmup(0L); // This prevents backgrounding after redirection            intent.launchUrl(context, uri);        }        @Override        public void onServiceDisconnected(ComponentName name) {}    };    CustomTabsClient.bindCustomTabsService(context, "com.android.chrome", connection);}

This doesn't work:

void launchTab(Context context, Uri uri){    final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();    final CustomTabsIntent intent = builder.build();    intent.launchUrl(context, uri);}

The Chrome Custom Tab docs describe warming up as a best practice, but it also appears to help ensure expected behavior.

In terms of env, I'm testing on a Nexus 5X w Chrome 51. My chrome tab dependency in Gradle looks like this:

dependencies {    compile 'com.android.support:customtabs:24.0.0'


If I used android:launchMode="singleInstance" there were multiple instances in the task manager so this was no option.

Starting the CustomTabsIntent with FLAG_ACTIVITY_NEW_TASK Flag did the trick.

CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();CustomTabsIntent intent = builder.build();intent.intent.setFlags(FLAG_ACTIVITY_NEW_TASK);intent.launchUrl(context, Uri.parse(url));


It helped me to set the Activity that I use to start a CustomTab to singleInstance mode in the manifest file:

    <activity        android:launchMode="singleInstance"        android:name="com.example.SingleInstanceActivityToStartCustomTab"    </activity>

And in the code I do as usual:

    CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();    final CustomTabsIntent customTabsIntent = builder.build();    customTabsIntent.intent.setPackage(someChromePackage);    customTabsIntent.launchUrl(singleInstanceModeActivity, someUriThatDoesRedirect);

I tried warming up Chrome and even calling customTabsIntent.launchUrl() with some delay after calling client.warmup(0l); and neither helped.