自动关闭Chrome自定义标签

时间:2017-03-01 11:11:39

标签: android chrome-custom-tabs

我有一个用于打开手机浏览器的应用程序,用户将被重定向到我的webapp,在某个用户操作后,webapp会使用意图过滤器重定向回应用程序

 <application>     
<activity
                android:name="com.xyz.sdk.SomeActivity"
                android:allowTaskReparenting="true"
                android:configChanges="keyboardHidden|orientation|keyboard|screenSize"
                android:launchMode="singleTask"
                android:noHistory="true"
                android:theme="@android:style/Theme.NoTitleBar">
                <intent-filter>
                    <data android:scheme="someString-${applicationId}" />
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                </intent-filter>
            </activity>
 </application>

最近我迁移到使用Chrome自定义标签而不是浏览器(出于安全考虑,Webview不是一个选项)

不幸的是,在Chrome自定义标签中重定向回应用时,Chrome自定义标签页不会自动关闭。即使我可以通过日志验证应用程序已收到响应,自定义选项卡仍保持打开并保持在最顶层,因此用户无法看到应用程序上发生了什么,直到他关闭应用程序。

我发现一个解决方法是在启动我的自定义标签时设置NEW_TASK标志,但这会使我的应用和自定义标签显示为两个单独的应用,这就是我首先从浏览器中移开的全部原因

总结:我有App A,它会打开一个自定义标签,在自定义标签中打开的webapp会使用意图过滤器重定向回App A,但vustom标签不会关闭并保持在顶部,直到用户手动关闭它为止

我已尝试为自定义标签页意图设置NO_HISTORY标志,但没有区别。

自定义标签代码:

   CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder()
                         .setShowTitle(true)
                         .setToolbarColor(getToolBarColor())
                         .setStartAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
                         .setExitAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
                         .build();
                 customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                 customTabsIntent.launchUrl(this, Uri.parse(url));
                 customTabsIntent.launchUrl(this, Uri.parse(url));

更新 我已经意识到如果intent过滤器重定向回另一个应用程序,那么自定义选项卡将成功关闭(前提是它是一个单一活动并且没有历史记录设置为true) 但在我的情况下,我们需要重定向回调用自定义选项卡的相同活动。

2 个答案:

答案 0 :(得分:5)

我也面临同样的问题,但就我而言,它现在正在发挥作用。

我使用FLAG_ACTIVITY_NO_HISTORY和FLAG_ACTIVITY_CLEAR_TOP启动了自定义标签。

customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

我的活动的launchMode是&#34; singleTop&#34;。

<activity
    android:name=".SomeActivity"
    android:theme="@style/SomeTheme"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:noHistory="true"
    android:launchMode="singleTop" >
    <intent-filter>
        <data android:scheme="intent" />
        <data android:scheme="myFile" />
        <data android:scheme="myScheme" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
</activity>

@bkant的重要更新:

  

我可以通过改变“单一技术”的启动模式来实现这一目标。要么“单一任务”要么或者&#39; singleInstance&#39;。在此模式下,重定向将通过&#39; onNewIntent&#39;进入同一个活动。

答案 1 :(得分:1)

此问题也可能存在于Xamarin中,并且答案适用于使用Xamarin.Forms时的问题。可以通过修改Activity属性来应用它。修改代码以匹配LaunchMode = LaunchMode.SingleTask

以下是来自https://developer.xamarin.com/samples/xamarin-forms/WebServices/OAuthNativeFlow/

的Xamarain.Auth的修改示例
namespace OAuthNativeFlow.Droid
{
     [Activity(Label = "CustomUrlSchemeInterceptorActivity", NoHistory = true, LaunchMode = LaunchMode.SingleTask)]
     [IntentFilter(
         new[] { Intent.ActionView },
         Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
         DataSchemes = new[] { "<insert custom URL here>" },
         DataPath = "/oauth2redirect")]
     public class CustomUrlSchemeInterceptorActivity : Activity
     {
         protected override void OnCreate(Bundle savedInstanceState)
         {
             base.OnCreate(savedInstanceState);

             // Convert Android.Net.Url to Uri
             var uri = new Uri(Intent.Data.ToString());

             // Load redirectUrl page
             AuthenticationState.Authenticator.OnPageLoading(uri);

             Finish();
         }
     }
 }