Проблема с Центром обмена сообщениями при его использовании в 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;
    });
}
Другие вопросы по тегам