Проблема с Центром обмена сообщениями при его использовании в OnCreate (Android) или AppDelagate (iOS) [Xamarin.Forms]
Я использую Центр обмена сообщениями для отправки и получения сообщений / данных в приложении. Приложение обрабатывает пользовательские расширения файлов, загружает их в приложение и работает с этими файлами.
Есть два способа импортировать файлы в приложение:
1- Нажмите кнопку "Обзор" в приложении и выберите файл (все работает нормально).
2- Нажатие непосредственно на файл, поскольку расширение файла связано с приложением, приложение открывается и импортирует выбранный файл. Здесь начинаются проблемы.
Если приложение не открывалось раньше и не работает в фоновом режиме (это означает, что подписчиков еще нет), приложение запускается и ничего не делает, как и ожидалось. Приложение отправляет выбранные файлы подписчику, но подписчик еще не доступен, потому что форма не завершила открытие (страницы и модели просмотра выполняются послеMainActivity
или AppDelagate).
Если приложение работает в фоновом режиме, щелчок по файлу открывает приложение и работает должным образом.
Я знаю о проблеме, но не знаю, как ее решить. Какие-либо предложения?
Это MainActivity.cs
в Android:
protected override async void OnNewIntent(Intent intent)
{
if (intent?.Data == null)
return;
// Open a stream from the URI
var lasStream = ContentResolver.OpenInputStream(intent.Data);
// Save it over
var memStream = new MemoryStream();
await lasStream.CopyToAsync(memStream);
var byteArray = memStream.ToArray();
MessagingCenter.Send(byteArray, "ByteArrayReceived");
}
Этот метод вызывается в одной из ViewModels в приложении:
private async Task ByteArrayReceived(byte[] byteArray)
{
// Handle incoming file as a byte array
}
ОБНОВИТЬ:
Думаю, вопрос был не таким ясным. Я постараюсь объяснить немного подробнее.
Я хочу сделать следующее: когда пользователь выбирает внешний файл (это может быть текстовый файл или что-то еще), это приложение должно запускаться и загружать содержимое выбранного файла в приложение.
Входящий файл обнаруживается в MainActivity.cs
который выполняется первым при открытии приложения, а это означает, что доступных подписчиков пока нет, поскольку приложение не завершило загрузку и метод подписчика еще не был вызван. Метод подписчика находится вMainPageView.cs
Я знаю, что метод подписчика должен быть вызван перед отправкой сообщений, но как мне это сделать в MainActivity.cs
или AppDelagate.cs
?
ОБНОВЛЕНИЕ 2:
MainPageView вызывается после выполнения MainActivity.cs.
Это MainActivity.cs
protected override void OnCreate(Bundle savedInstanceState)
{
base.Window.RequestFeature(WindowFeatures.ActionBar);
base.SetTheme(Resource.Style.MainTheme);
if (Intent.Action == Intent.ActionSend || Intent.Action == Intent.ActionView)
HandleIntent(Intent);
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
Это App.cs
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new MainPageView());
}
1 ответ
Одно из решений, которое я нашел, заключается в том, что вы можете отправить сообщение через X секунд, используя Device.StartTimer:
protected override async void OnNewIntent(Intent intent)
{
if (intent?.Data == null)
return;
// Open a stream from the URI
var lasStream = ContentResolver.OpenInputStream(intent.Data);
// Save it over
var memStream = new MemoryStream();
await lasStream.CopyToAsync(memStream);
var byteArray = memStream.ToArray();
// run task after 2 second
Device.StartTimer(TimeSpan.FromSeconds(2), () =>
{
MessagingCenter.Send(byteArray, "ByteArrayReceived");
// No longer need to recur. Stops firing task
return false;
});
}