Путаница между всеми параметрами фона (и их эволюцией во времени) в Xamarin.Forms Android

Я тестировал различные варианты фона (образцы xamarin, статьи в блогах xamarin, различные источники), но мне хотелось бы получить некоторые разъяснения по поводу преимуществ и недостатков каждого из них, а также о том, что некоторые из них устарели / устарели.

Мой случай - это приложение (Wi-Fi, на территории клиента), которое должно периодически опрашивать сервер на предмет новых данных или отправлять собранные данные на сервер, как только он установит соединение (он должен продолжать сбор данных, если соединение недоступно, но нажимать к серверу, как только он установит соединение).

Я хочу, чтобы эта синхронизация выполнялась в фоновом режиме для пользователя, который тем временем может продолжать работать. Я хотел бы, чтобы push (если есть данные) выполнялся каждые 1 или 2 минуты, поэтому я могу просто создать задачу в фоновом задании с бесконечным временем, которое проверяет каждые 1/2 минуты.

Я сделал несколько основных образцов для тестирования:

1) с помощью LongRunningTaskService: Service

2) с помощью Firebase.JobDispatcher

3) с помощью WorkManager (но запланированные задания не могут быть менее 15 минут)

4) смотрю на Shiny, но в настоящее время у него проблемы с интеграцией с Prism (но я думаю, я заставлю его работать) (но не понимаю, является ли это оболочкой чего именно?)

Как вы думаете, какое решение подходит для моего случая использования? Во всех четырех решениях данные должны передаваться, когда приложение находится на переднем плане или в фоновом режиме (верно?)

Если мне нужно отправлять данные только тогда, когда приложение находится на переднем плане, было бы неправильно запускать мою задачу в классе приложения?

ОБНОВИТЬ

Пробовал это в OnInitialized () файла App.cs:

Task.Factory.StartNew(async () =>
            {
                while (true)
                {                    
                    await BackgroundTasks.TestPushDataRepeat();
                    await Task.Delay(60000);
                }
            }
            , TaskCreationOptions.LongRunning);

Он работает каждую минуту, когда приложение находится на переднем плане (и не блокирует пользовательский интерфейс), но неожиданно работает также, когда приложение находится в фоновом режиме (в моем случае это лишний плюс). Я подумал, что это не сервис, он должен был остановиться, почему?

Я пытаюсь лучше понять / разделить, как TPL работает с Xamarin на Android, и как работает фоновое управление Android (службы / рабочие и т. Д.), Чтобы увидеть, есть ли у этого решения недостатки.


person Mattia Durli    schedule 22.04.2020    source источник
comment
В Xamarin обычно мы используем службу для получения и передачи данных. Вы можете использовать 1) базовый образец   -  person Wendy Zang - MSFT    schedule 23.04.2020
comment
спасибо @ WendyZang-MSFT, я понял, что JobDispatcher является преемником Сервиса (более или менее), а WorkManager является преемником JobDispatcher. Это неправильно? как они тогда сравниваются? каковы варианты использования каждого из них?   -  person Mattia Durli    schedule 23.04.2020
comment
WorkManager - это новая система управления заданиями в Jetpack, включающая в себя функции диспетчера заданий Firebase (FJD) и JobScheduler для Android. Для сравнения вы можете перейти по ссылке ниже. stackoverflow.com/questions/50279364/   -  person Wendy Zang - MSFT    schedule 29.04.2020


Ответы (1)


На Android вы не можете запускать фоновую задачу / задание / рабочего каждые 30 секунд. Такое поведение может отрицательно сказаться на батарее и может быть достигнуто только с помощью службы переднего плана, которая требует уведомления, видимого пользователю.

Ограничение, которое вы видите для WorkManager в пределах минимального 15-минутного интервала, является ограничением ОС, а не ограничением библиотеки. У вас такой же лимит, если вы используете JobScheduler. Также Worker (или Job, если вы используете JobScheduler) может работать только в течение 10 минут.

Итак, вам нужна служба переднего плана. В этом случае вы по-прежнему можете использовать WorkManager и его расширенные функции, но вам нужно использовать WorkManager 2.3+ и «повысить» своего рабочего до службы переднего плана. Этот вариант использования описан в документации WorkManager.

Это для собственного Android (Java / Kotlin). Я не знаю, как последняя привязка Xamarin покрывает этот вариант использования.

person pfmaggi    schedule 25.04.2020
comment
Спасибо за разъяснения (особенно за ограничение в 10 минут), и я понимаю, что ограничение заключается в ОС. Поскольку мой приоритет - делать push каждые 1-2 минуты, когда приложение находится на переднем плане, но прозрачно для пользователя (так, в фоновой задаче приложения переднего плана), каковы недостатки использования TaskFactory.StartNew с цикл и задержка в 1 минуту между каждой попыткой нажатия? Он не должен блокировать пользовательский интерфейс во время нажатия, и он должен останавливаться, когда приложение становится фоновым (мне все еще нужно его протестировать, но мне интересно, приемлемо ли это в качестве фонового решения для приложения переднего плана). - person Mattia Durli; 26.04.2020
comment
Лично я рассмотрю возможность использования службы переднего плана. Это самый безопасный и перспективный способ справиться с тем, что должно работать в течение длительного времени в фоновом режиме. Повторное вращение новой задачи каждые 1-2 минуты может иметь худшее влияние на батарею, но это то, что вам нужно проверить. - person pfmaggi; 26.04.2020
comment
Я протестировал службу переднего плана, и она работает. Но я также протестировал код в моем обновленном вопросе, и он тоже работает (даже когда приложение находится в фоновом режиме, и я не понимаю, почему). Решение TPL кажется более простым, поэтому я пытаюсь понять, есть ли у него какие-то недостатки, о которых я не знаю. - person Mattia Durli; 27.04.2020
comment
Попробуйте выполнить стресс-тест памяти эмулятора и посмотрите, имеет ли это значение, когда Android пытается найти память. Кроме того, на какой версии Android вы это тестируете? - person pfmaggi; 27.04.2020
comment
Я тестирую устройство (Zebra TC25 с Android 8.1), как имитировать запрос памяти Android? Кроме того, меня сбивает с толку то, что в фоновом режиме моя задача продолжает срабатывать каждые 60 секунд. Я знаю это точно по логгированию logcat и по тому факту, что он фактически отправляет мои фальшивые данные на сервер в фоновом режиме. Я всегда понимал, что в фоновом режиме приложение зависает, и в фоновом режиме могут работать только службы / задания / рабочие, а не задача TPL, управляемая моно / xamarin. - person Mattia Durli; 28.04.2020
comment
Устройства Android ведут себя по-разному, заряжаются они или нет, активно ли пользователь использует устройство или нет: developer.android.com/training/monitoring-device-state/ Для проверки состояния нехватки памяти вы можете включить параметр разработчика: не сохранять активность. Также попробуйте запустить какое-нибудь тяжелое приложение, пока ваше приложение работает в фоновом режиме: stackoverflow.com/questions/15588625/ - person pfmaggi; 30.04.2020
comment
Хорошо, я попытался протестировать Task.Factory.StartNew на реальном устройстве, а не на ответственном, с приложением фоновой подсветки. Цикл в задаче продолжает выполняться каждые 60 секунд и делает HTTP-запрос для моего серверного приложения. Если я активирую функцию «Не сохранять активность», она прекращается, но это понятно. Он также останавливается под давлением, но это нормально, потому что приложение убивается. Я не понимаю, почему при простом фоновом режиме вместо зависания этот Task.Factory, который является моноуправляемым потоком, продолжает работать. Поэтому мое предположение о том, что приложение зависает в фоновом режиме (продолжают работать только службы, задания и т. Д.), Неверно. Это? - person Mattia Durli; 06.05.2020