Сбой службы Xamarin Forms с изолированным процессом - PullRequest
0 голосов
/ 06 ноября 2018

Я разрабатываю приложение для Android с Xamarin Forms, которое состоит из интерфейса, а также фонового сервиса. Мне нужно, чтобы служба работала также, когда интерфейс приложения закрыт. Если я добавлю «IsolatedProcess = true» в сервис, графический интерфейс все еще будет работать, но сервис вылетит. Я прочитал много постов с возможными решениями, но они не работают. (Я попытался скомпилировать в режиме выпуска, а также убрать флаг «Использовать общее время выполнения»).

Я компилирую с Android 8.1 (Oreo) в качестве Target Framework. Целевая среда - Android 4.2.

Я запускаю службу в методе OnCreate класса MainActivity:

Intent testIntent = new Intent(this.BaseContext, typeof(TestService));
StartService(testIntent);

Класс обслуживания:

[Service(IsolatedProcess = true, Exported = true, Label = "TestService")]
public class TestService : Service
{

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

    public override void OnCreate()
    {
        base.OnCreate();

    }

    [return: GeneratedEnum]
    public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
    {            
        Device.StartTimer(new TimeSpan(0, 0, 40), () =>
        {
            //Code executed every 40 seconds
        });

        base.OnStartCommand(intent, flags, startId);
        return StartCommandResult.Sticky;

    }

    public override bool StopService(Intent name)
    {
        return base.StopService(name);
    }

}

Если я удалю «IsolatedProcess = true», служба будет работать, но остановится, когда я закрою процесс интерфейса приложения.

1 Ответ

0 голосов
/ 03 мая 2019

Я решил проблему, изменив значение атрибута IsolatedProcess на true, удалив инструкцию Device.StartTimer и представив BroadcastReceiver.

Класс MainActivity:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        public static Intent testServiceIntent;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

            testServiceIntent = new Intent(this.BaseContext, typeof(TestService));

            LoadApplication(new App());
        }
    }

Класс обслуживания:

[Service(IsolatedProcess = false, Exported = true, Label = "TestService")]
    public class TestService : Service
    {
System.Threading.Timer _timer;

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

        public override void OnCreate()
        {
            base.OnCreate();
        }

        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            businessLogicMethod();

            base.OnStartCommand(intent, flags, startId);
            return StartCommandResult.Sticky;

        }

public void businessLogicMethod()
        {
 //My business logic in a System.Threading.Timer

}
}

Класс приемника вещания:

[BroadcastReceiver]
    [IntentFilter(new[] { Intent.ActionBootCompleted })]
    public class TestApplicationBroadcastReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Log.Info("TestApp", "******* Loading Application *******");

            try
            {
                if (intent.Action.Equals(Intent.ActionBootCompleted))
                {                    
                    Intent service = new Intent(context, typeof(TestService));
                    service.AddFlags(ActivityFlags.NewTask);
                    context.StartService(service);
                }
            }
            catch (Exception ex)
            {
                Log.Error("TestApp", "******* Error message *******: " + ex.Message);
            }
        }
    }

Надеюсь, это кому-нибудь пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...