Автоматическое закрытие пользовательской вкладки 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();
}
}
}