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