NET MAUI Android:ForegroundService 未持续运行

问题描述 投票:0回答:1

我创建了一个带有前台服务的简单 MAUI 应用程序。 我从 StackOverflow 中找到的示例开始(如何在 MAUI 中创建 Android 前台服务)。 该服务正在启动一个简单的记录器,每 5 秒将时间戳写入文件中。

只要我的应用程序被激活,服务就可以正常运行。 当应用程序停用时,时间戳变得越来越罕见、异常,有时甚至停止。 恢复应用程序时,服务将再次持续运行。

对于日志记录类,我尝试了两种不同的方法

1.) System.Timer 每 5 秒流逝一次并写入时间戳

2.) 记录器在自己的线程中运行循环并休眠 5 秒

感谢您的评论和帮助!

晴天

环境:Visual Studio 2022、.NET 7.0、Android 设备 API 31

[Service]
public partial class LocationService : Service
{
    private SimpleLogger _logger;
    public LocationService()
    {
        _logger = new SimpleLogger();
    }

    public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
    {
        if (intent.Action == "START_SERVICE")
        {
            var notification = RegisterNotification();
            StartForeground(100, notification);
            _logger.Start();
        }
        else if (intent.Action == "STOP_SERVICE")
        {
            StopForeground(true);
            _logger.Stop(); 
            StopSelfResult(startId);
        }

        return StartCommandResult.NotSticky;
    }

    public partial void Start()
    {
        Intent startService = new Intent(MainActivity.ActivityCurrent, typeof(LocationService));
        startService.SetAction("START_SERVICE");
        MainActivity.ActivityCurrent.StartService(startService);
    }

    public partial void Stop()
    {
        Intent stopIntent = new Intent(MainActivity.ActivityCurrent, this.Class);
        stopIntent.SetAction("STOP_SERVICE");
        MainActivity.ActivityCurrent.StartService(stopIntent);
    }

    private Notification RegisterNotification()
    {
        NotificationChannel channel = new NotificationChannel("ServiceChannel", "ServiceDemo", NotificationImportance.Max);
        NotificationManager manager = (NotificationManager)MainActivity.ActivityCurrent.GetSystemService(Context.NotificationService);
        manager.CreateNotificationChannel(channel);

        Notification notification = new Notification.Builder(this, "ServiceChannel")
           .SetContentTitle("Service Working")
           //.SetSmallIcon(Resource.Drawable.abc_ab_share_pack_mtrl_alpha)
           .SetSmallIcon(Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu ? Resource.Drawable.abc_action_bar_item_background_material : Resource.Mipmap.appicon)
           .SetOngoing(true)
           .Build();

        return notification;
    }
    public override IBinder OnBind(Intent intent)
    {
        throw new NotImplementedException();
    }
}

感谢您的回答!我添加了 SimpleLogger 的代码,希望这有帮助!

    public class SimpleLogger
{
    private const int _periodMsec = 5000;
    private Timer _timer;
    private string _pathFilename;
    public SimpleLogger()
    {
        _pathFilename = Path.Combine(FileSystem.Current.CacheDirectory, "DemoLogging.txt");
    }

    public void Start()
    {
        _timer = new Timer(TimerElapsed, null, 0, _periodMsec);
    }

    public void Stop()
    {
        _timer.Dispose();
        _timer = null;
    }

    private void TimerElapsed(object state)
    {
        var s = DateTime.Now.ToString("G");
        System.Diagnostics.Debug.WriteLine($"SimpleLogger.TimerElapsed() {s}");

        using (StreamWriter sw = File.AppendText(_pathFilename))
        {
            sw.WriteLine(s);
        }
    }
}
android maui foreground-service
1个回答
0
投票

我也遇到过这种情况。我在 Net Maui 上运行一个服务,该服务运行一个计时器,每 1 分钟进行一次 Rest API 调用。它工作完美!但过了一段时间,如果我让手机处于静止状态,它就不再每 1 分钟运行一次,而是每隔几分钟运行一次。如果我再次拿起手机,它会每隔 1 分钟再次工作一次。我放置了一个日志,告诉我 try catch 是否有错误,没有!没有出现错误,只是计时器停止工作。

© www.soinside.com 2019 - 2024. All rights reserved.