Как создать бесконечную фоновую службу в Xamarin.Forms?

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

Я попробовал этот образец, но он находится в Xamarin.Android https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/services/foreground-services мне нужно создать службу зависимостей, но я не знаю, как это сделать.


person naye mtz    schedule 25.09.2019    source источник
comment
Что касается Android, я могу сказать, что никогда нельзя гарантировать, что фоновая служба всегда будет работать, из-за некоторых ограничений, например, когда ресурсы устройства находятся под давлением, также Google наложил дополнительные ограничения в более новых версиях Android или даже ограничения, которые применяют некоторые производители. Одним из возможных вариантов для Android может быть использование Foreground Services.   -  person VahidShir    schedule 26.09.2019
comment
Спасибо, для меня важна эта информация   -  person naye mtz    schedule 26.09.2019


Ответы (2)


Мне нужно создать службу зависимостей, но я не знаю, как это сделать.

Сначала создайте Interface в проекте Xamarin.forms:

public interface IStartService
{

    void StartForegroundServiceCompat();
}

А затем создайте новый файл, назовем его itstartServiceAndroid в проекте xxx.Android, чтобы реализовать нужный сервис:

[assembly: Dependency(typeof(startServiceAndroid))]
namespace DependencyServiceDemos.Droid
{
    public class startServiceAndroid : IStartService
    {
        public void StartForegroundServiceCompat()
        {
            var intent = new Intent(MainActivity.Instance, typeof(myLocationService));


            if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
            {
                MainActivity.Instance.StartForegroundService(intent);
            }
            else
            {
                MainActivity.Instance.StartService(intent);
            }

        }
    }

    [Service]
    public class myLocationService : Service
    {
        public override IBinder OnBind(Intent intent)
        {
        }

        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {
            // Code not directly related to publishing the notification has been omitted for clarity.
            // Normally, this method would hold the code to be run when the service is started.

            //Write want you want to do here

        }
    }
}

Если вы хотите вызвать метод StartForegroundServiceCompat в проекте Xamarin.forms, вы можете использовать:

public MainPage()
{
    InitializeComponent();

    //call method to start service, you can put this line everywhere you want to get start
    DependencyService.Get<IStartService>().StartForegroundServiceCompat();

}

Вот документ о службе зависимостей

Для iOS, если пользователь закроет приложение на панели задач, вы больше не сможете запускать какие-либо службы. Если приложение работает, вы можете прочитать этот документ о пошаговое руководство по ios-backgrounding/местоположение

person Jack Hua    schedule 26.09.2019
comment
Основная Активность. Экземпляр. У меня нет экземпляра, он нулевой. Как я могу это исправить? :) - person M Yil; 18.03.2020
comment
Создайте статическое свойство Instance в MainActivity. - person Jack Hua; 19.03.2020
comment
Привет. Я не могу найти этот экземпляр. Что это? - person Daniel Dolz; 16.01.2021
comment
Это ссылка на MainActivity. - person Jack Hua; 18.01.2021
comment
Привет. Не могли бы вы помочь мне с определением IBinder? - person Pavel Polushin; 18.01.2021

Возможно, вы захотите взглянуть на Shiny Аллана Ритчи. В настоящее время он находится в стадии бета-тестирования, но я бы все же рекомендовал его использовать, так как это избавит вас от многих проблем при самостоятельном написании этого кода. Вот сообщение в блоге Аллана, объясняющее, что вы можете делать с Shiny с точки зрения фоновых задач — я думаю Запланированные задания — это то, что вам нужно.

person Mikolaj Kieres    schedule 26.09.2019
comment
Но это не сработает, верно? Потому что вам нужна служба переднего плана, чтобы часто получать местоположение. - person M Yil; 17.03.2020