Xamarin Запустить новый сервис с IsolatedProcess = true - PullRequest
0 голосов
/ 20 марта 2020

Итак, у меня проблема с буксировкой, я хотел бы, чтобы ваша помощь разрешилась.

Сначала, когда я установил IsolatedProcess = true OnStartCommand, никогда не срабатывал

. Проблема со звуком - это когда я начинаю свое уведомление, я получаю $projectname$ в моем уведомлении по какой-то причине.

Вот мой сервисный код.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace Comic.Viewer.Droid.Services
{
    [Service(IsolatedProcess = true, Label = "ComicViewer.ChapterNotifier.Service")]
    public class ChapterNotifier : Android.App.Service
    {
        public override IBinder OnBind(Intent intent)
        {
            throw new NotImplementedException();
        }

        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {
            var NotificationHelper = new NotificationHelper(MainActivity.CurrentActivity);


            intent.AddFlags(ActivityFlags.ClearTop);



            while (true)
            {
                var favs = DataStore.Db.GetFavorits(DataStore.AppSettings.CurrentUser.Id);

                foreach (var item in favs)
                {
                    var update = item.Translator == Modols.Translator.W_World_Translator ?
                                 DataStore.Wuxiaworld.SerieUpdates(item.Query) : (item.Translator == Modols.Translator.Boxnovel ?
                                 DataStore.Boxnovel.SerieUpdates(item.Query) : DataStore.NovelOver.SerieUpdates(item.Query));

                    var message = "";
                    if (update.NewChapters > 0)
                    {
                        message += $"{item.SerieName} Has {update.NewChapters} new chapter";

                        var NotificationId = Helper.GetRandomId();
                        var pendingIntent = PendingIntent.GetActivity(MainActivity.CurrentActivity, NotificationId, intent, PendingIntentFlags.Immutable);
                        var nb = NotificationHelper.GetNotification1(GetString(Resource.String.ApplicationName), message, pendingIntent);
                        if (Build.VERSION.SdkInt >= BuildVersionCodes.O) StartForeground(NotificationId, nb.Build());
                        NotificationHelper.Notify(NotificationId, nb);
                    }
                }
                Thread.Sleep(18000000);
            }

        }
    }
}

и вот как я начинаю свою службу

public void StartService()
        {

            var intent = new Intent(_context, typeof(ChapterNotifier));
            if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
                _context.StartForegroundService(intent);
            else
                _context.StartService(intent);
        }

1 Ответ

1 голос
/ 20 марта 2020

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

Одна из них - запуск Задачи вместо блокировки основного потока.

Итак, инкапсулируйте свою логику c таким способом, как:

private async Task ReadFavorites(CancellationToken token = default)
{
    while(!token.IsCancellationRequested)
    {
        // your database and notification logic here...
        await Task.Delay(18000000, token);
    }
}

Затем в OnStartCommand вы можете запустить его с помощью:

_ = Task.Run(() => ReadFavorites());

Если вы в какой-то момент захотите Чтобы остановить эту службу и отменить задачу, вы можете создать CancellationTokenSource и передать CancellationToken из этого в метод:

var cts = new CancellationTokenSource();

var token = cts.Token;

Затем передать этот токен в запущенную задачу:

_ = Task.Run(() => ReadFavorites(token), token);

Таким образом, вы можете позвонить cts.Cancel(), чтобы отменить любые задачи, которые вы больше не хотите запускать.

Однако, что-то вроде этого, вероятно, было бы лучше сделать с помощью JobScheduler API в Android, так как вы все равно так долго ждете между проверками. Таким образом, вам не понадобится постоянно работающая служба переднего плана с отображением уведомления.

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