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.