Вопрос или проблема
Я в настоящее время переношу приложение с 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:
-
Неправильный запуск активити: При запуске приложения вместо
MainActivity
запускаетсяSecondaryActivity
, несмотря на выставленный параметрMainLauncher = true
. -
Проблемы со сплэш-экраном: При нажатии на ярлык приложение показывает сплэш-экран, указывающий на его повторный запуск, после чего открывается
SecondaryActivity
. -
Краш при закрытом приложении: При попытке запустить приложение из ярлыка, оно крашится из-за ошибки, связанной с несовпадением свойств на уровне 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
-
Настройка активностей:
-
Убедитесь, что
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 { }
-
-
Обработка
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(); } }
- Для корректного управления событиями от закрпленных ярлыков рассмотрите возможность обработки
-
Доступ к свойствам UI:
- Проверьте вашу разметку и классы представлений на наличие ошибок привязки и инициализации. Все зависимости должны быть корректно установлены и инициализированы до того, как вы будете пытаться их использовать.
Заключение
Настройка закрпленных ярлыков в MAUI требует более тщательной проработки, чем в Xamarin, и может быть источником новых проблем. Рекомендуется тщательно проверять конфигурацию активностей и корректно обрабатывать Intent
, чтобы обеспечить стабильную работу приложения. Надеюсь, вышеприведённые рекомендации помогут вам успешно решить вопросы, связанные с миграцией приложения.