Автоматическое закрытие пользовательской вкладки chrome

у меня было приложение, которое использовалось для открытия браузера телефона, где пользователь будет перенаправлен на мой 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 при инициировании моей пользовательской вкладки, но это делает мое приложение и пользовательскую вкладку двумя отдельными приложениями, что является всей причиной, по которой я отошел от браузеров в первую очередь.

in summary: у меня есть приложение A, которое открывает пользовательскую вкладку, веб-приложение, открытое на вкладке custom, перенаправляется обратно в приложение 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));

обновление Я понял, что если фильтр намерения перенаправить обратно в другое приложение, то пользовательская вкладка закрывается успешно (при условии, что его действие singletop и история не имеет значения true) Но в моем случае нам нужно перенаправить обратно к тому же действию, из которого были вызваны пользовательские вкладки.

2 ответов


Я также столкнулся с той же проблемой, но в моем случае она теперь работает.

Я запустил пользовательскую вкладку с 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 моей деятельности был "singleTop".

<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>

эта проблема может существовать и в Xamarin, и ответ применяется к проблеме при использовании Xamarin.Формы. Его можно применить, изменив атрибут Activity. Измените код, чтобы он соответствовал LaunchMode = LaunchMode.SingleTask

вот измененный пример Xamarain.Auth из https://developer.xamarin.com/samples/xamarin-forms/WebServices/OAuthNativeFlow/

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();
         }
     }
 }