Путаница между всеми вариантами фона (и их эволюцией во времени) с Xamarin.Forms Android - PullRequest
0 голосов
/ 23 апреля 2020

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

В моем случае это приложение (wifi, на территории клиента), которое должно периодически запрашивать у сервера новые данные, или pu sh собирает данные на сервер, как только у него есть соединение (оно должно продолжать собирать данные, если соединение не установлено. доступно, но pu sh к серверу, как только он подключится).

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

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

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

2) с использованием Firebase.JobDispatcher

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

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

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

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

ОБНОВЛЕНИЕ

Попробовал это в OnInitialized () приложения.cs:

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

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

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

1 Ответ

1 голос
/ 25 апреля 2020

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

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

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

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

...