Android Служба вызвана два раза неправильно с одним методом StartService - PullRequest
0 голосов
/ 20 апреля 2020

Следующий код, который работает нормально, неожиданно неправильно печатает приведенное ниже сообщение два раза:

MainApplicationService started
MyMessagemessage received

MainApplicationService started
MyMessagemessage received

Код ниже:

  [Activity(Label = "My app", MainLauncher = true, Name = "com.myapp.StartupActivity")]
    public class StartupActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            Intent serviceIntent = new Intent(this, typeof(MainApplicationService));

            StartService(serviceIntent);

            Finish();
        }
    }

[Service(Name = "com.myapp.MainApplicationService", Label = "Main Application Service", Exported = false)]
    public class MainApplicationService : Service
    {
        private IDeviceLog _logger;

        public override IBinder OnBind(Intent intent)
        {
            return null;
        }

        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            _logger = Ioc.Container.Resolve<IDeviceLog>();
            _logger.Info("MainApplicationService started");
             var worker = Ioc.Container.Resolve<IWorker>();
            Task.Run(async () => await worker.Init());

            return StartCommandResult.Sticky;
        }
    }

    public class Worker:IWorker {           
      private async Task Init(){

      _deviceLog.Info($"{nameof(MyMessagemessage)} received");  //called two times wrongly

      }
  }

После перезапуска приложения сообщение печатается один раз, как показано ниже

MainApplicationService started
MyMessagemessage received

Xamarin Android, Android Леденец

1 Ответ

0 голосов
/ 20 апреля 2020

Система может уничтожить службу из-за недостатка памяти, если это произойдет, система перестроит службу как можно скорее. Вы можете определить состояние службы в вашем OnStartCommand, например:

private bool isStarted;

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {
        if (isStarted)
        {
            // service is already started
        }
        else
        {
            _logger = Ioc.Container.Resolve<IDeviceLog>();
            _logger.Info("MainApplicationService started");
            var worker = Ioc.Container.Resolve<IWorker>();
            Task.Run(async () => await worker.Init());
            isStarted = true;
        }
        return StartCommandResult.Sticky;
    }
...