Поведение зафиксированных ярлыков MAUI

Вопрос или проблема

Я в настоящее время переношу приложение с Xamarin на MAUI, и у меня возникла проблема при попытке настроить закрепленное ярлык для вторичного Activity на Android.

SecondaryActivity отображает интерфейс в режиме PiP, уведомляет сервер о том, что был сделан запрос, а затем закрывается.

В Xamarin следующая конфигурация работает как ожидалось:

MainActivity

[Activity(Label = "MainActivity", Icon = "@mipmap/icon", RoundIcon = "@mipmap/icon_round", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]

SecondaryActivity

[Activity(Label = "SecondaryActivity", Exported = true, SupportsPictureInPicture = true), IntentFilter( new [] { Intent.ActionCreateShortcut }, Categories = new[] { Intent.CategoryLauncher } )]

Пользователь может создать ярлык для SecondaryActivity на устройстве (реализовано с помощью ShortcutManagerCompat.RequestPinShortcut), и запустить активность без запуска всего приложения, как и ожидалось.

При использовании той же конфигурации в MAUI я столкнулся с несколькими заметными отличиями:

  • При запуске приложения, вместо того чтобы начинаться с MainActivity, приложение запустило SecondaryActivity, полностью игнорируя MainLauncher = true. Я удалил Categories = new[] { Intent.CategoryLauncher } из SecondaryActivity, и приложение запустилось как ожидалось.

  • При нажатии на ярлык, когда приложение находится в фоновом режиме, на мгновение появляется экран загрузки приложения, указывая на то, что приложение перезапускается в какой-то степени, а затем запускается SecondaryActivity.

  • При нажатии на ярлык, когда приложение закрыто, появляется тот же экран загрузки по умолчанию, но теперь приложение выдает ошибку.
    В трассировке стека я вижу, что запускается все приложение с:

    • Microsoft.Maui.MauiApplication.OnCreate()
    • ApplicationName.App..ctor()
    • ApplicationName.Views.MainPage..ctor()

    и затем происходит сбой на Cannot assign property "TextColor": Property does not exist, or is not assignable, or mismatching type between value and property

Я пробовал LaunchMode = LaunchMode.SingleTask, LaunchMode = LaunchMode.SingleInstance, никаких изменений.

Мое предположение заключается в том, что Categories = new[] { Intent.CategoryLauncher } должно использоваться в SecondaryActivity для того, чтобы указать, что существует другой возможный запускатель для приложения. Но даже с этой конфигурацией происходит тот же сбой, когда нажимается ярлык.

Мне нужно обработать интент SHORTCUT в MainApplication или MauiProgram, чтобы это работало?

Каков правильный способ реализации закрепленных ярлыков в MAUI?

Ответ или решение

Поведение закрепленных ярлыков в MAUI: Полное руководство

Введение

При миграции приложения с использованием Xamarin на MAUI многие разработчики сталкиваются с вопросами относительно поведения закрпленных ярлыков, особенно для вторичных активностей в Android. В этом контексте мы рассмотрим вашу проблему с настройкой второго ярлыка и попробуем дать рекомендации по его правильной настройке и реализации.

Проблема

Вы указали на несколько ключевых проблем, возникающих при работе с MAUI:

  1. Неправильный запуск активити: При запуске приложения вместо MainActivity запускается SecondaryActivity, несмотря на выставленный параметр MainLauncher = true.

  2. Проблемы со сплэш-экраном: При нажатии на ярлык приложение показывает сплэш-экран, указывающий на его повторный запуск, после чего открывается SecondaryActivity.

  3. Краш при закрытом приложении: При попытке запустить приложение из ярлыка, оно крашится из-за ошибки, связанной с несовпадением свойств на уровне UI.

Анализ

1. Неправильный запуск активити

Проблема с тем, что SecondaryActivity запускается вместо MainActivity, может быть связана с неправильной настройкой IntentFilter для SecondaryActivity. В MAUI настройка фильтров может иметь другую логику. Если не требуется, чтобы SecondaryActivity была основной, удаление Categories = new[] { Intent.CategoryLauncher } может быть правильным шагом.

2. Сплэш-экран

Появление сплэш-экрана при запуске приложения связано с тем, что Android повторно инициализирует приложение при запуске SecondaryActivity. Это может указывать на проблемы с конфигурацией LaunchMode. Параметры SingleTask или SingleInstance могут не работать должным образом в контексте MAUI. Рекомендуется устанавливать LaunchMode только для MainActivity и обеспечить, чтобы SecondaryActivity не вмешивалась в логическую инициализацию вашего приложения.

3. Краш приложения

Ошибка Cannot assign property "TextColor": Property does not exist, or is not assignable, or mismatching type between value and property может быть вызвана попыткой доступа к несуществующим свойствам UI при загрузке MainPage. Это может быть связано с тем, что сессии инициализации различаются между активностями в MAUI и Xamarin. В этом случае желательно откатить изменение конфигурации и удостовериться, что все элементы UI корректно инициализированы.

Рекомендации по реализации закрпленных ярлыков в MAUI

  1. Настройка активностей:

    • Убедитесь, что MainActivity настроена как основной с использованием параметров:

      [Activity(Label = "MainActivity", Icon = "@mipmap/icon", RoundIcon = "@mipmap/icon_round", Theme = "@style/MainTheme", MainLauncher = true)]
      public class MainActivity : MauiAppCompatActivity { }
    • Для SecondaryActivity используйте:

      [Activity(Label = "SecondaryActivity", Exported = true, SupportsPictureInPicture = true)]
      [IntentFilter(new[] { Intent.ActionCreateShortcut }, Categories = new[] { Intent.CategoryDefault })]
      public class SecondaryActivity : Activity { }
  2. Обработка SHORTCUT Intent:

    • Для корректного управления событиями от закрпленных ярлыков рассмотрите возможность обработки Intent в MauiProgram или в MainApplication. Например:
      protected override void OnCreate(Bundle savedInstanceState)
      {
      base.OnCreate(savedInstanceState);
      // Обработка Intent для SHORTCUT
      var intent = Intent;
      if (intent.Action == Intent.ActionView)
      {
          OpenSecondaryActivity();
      }
      }
  3. Доступ к свойствам UI:

    • Проверьте вашу разметку и классы представлений на наличие ошибок привязки и инициализации. Все зависимости должны быть корректно установлены и инициализированы до того, как вы будете пытаться их использовать.

Заключение

Настройка закрпленных ярлыков в MAUI требует более тщательной проработки, чем в Xamarin, и может быть источником новых проблем. Рекомендуется тщательно проверять конфигурацию активностей и корректно обрабатывать Intent, чтобы обеспечить стабильную работу приложения. Надеюсь, вышеприведённые рекомендации помогут вам успешно решить вопросы, связанные с миграцией приложения.

Оцените материал
Добавить комментарий

Капча загружается...