gpt4 book ai didi

c# - Xamarin 表单后台任务仅在应用程序在 ios 上打开时运行

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:21:15 25 4
gpt4 key购买 nike

  1. 预期行为
    • ios
      • 当应用程序最小化并且每 5 秒收到一次通知时。
    • 安卓
      • 当应用程序最小化并且每 5 秒收到一次通知时。
  2. 实际行为
    • ios
      • 应用程序最小化并且没有通知进来,打开应用程序会导致每 5 秒收到一次通知。
    • 安卓
      • 当应用程序最小化并且每 5 秒收到一次通知时。
        //from app.xaml.cs
        protected override void OnSleep()
        {
        void ScheduleNotification()
        {
        // Start a timer that runs after 5 seconds.
        Device.StartTimer(TimeSpan.FromSeconds(5), () =>
        {
        System.Threading.Tasks.Task.Factory.StartNew( () =>
        {
        // Do the actual request and wait for it to finish.
        PerformNotification();
        // Switch back to the UI thread to update the UI
        Device.BeginInvokeOnMainThread(() =>
        {
        // Update the UI
        // ...
        // Now repeat by scheduling a new request
        ScheduleNotification();
        count++;
        });
        }, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

        // Don't repeat the timer (we will start a new timer when the request is finished)
        return false;
        });
        }
        void PerformNotification()
        {
        CrossLocalNotifications.Current.Show("title", "body"+ count.ToString());

        }
        ScheduleNotification();
        }

最佳答案

在 iOS 上,不要求在后台运行的应用程序在后台运行的时间不能超过 10 秒。为了使某些代码在后台运行,您可以在 iOS 和 android 上实现 DependencyService。您可以将以下代码放入 iOS 上的该服务中:

public async Task RunCodeInBackgroundMode(Func<Task> action, string name = "MyBackgroundTaskName")
{
nint taskId = 0;
var taskEnded = false;
taskId = UIApplication.SharedApplication.BeginBackgroundTask(name, () =>
{
//when time is up and task has not finished, call this method to finish the task to prevent the app from being terminated
Console.WriteLine($"Background task '{name}' got killed");
taskEnded = true;
UIApplication.SharedApplication.EndBackgroundTask(taskId);
});
await Task.Factory.StartNew(async () =>
{
//here we run the actual task
Console.WriteLine($"Background task '{name}' started");
await action();
taskEnded = true;
UIApplication.SharedApplication.EndBackgroundTask(taskId);
Console.WriteLine($"Background task '{name}' finished");
});

await Task.Factory.StartNew(async () =>
{
//Just a method that logs how much time we have remaining. Usually a background task has around 180 seconds to complete.
while (!taskEnded)
{
Console.WriteLine($"Background task '{name}' time remaining: {UIApplication.SharedApplication.BackgroundTimeRemaining}");
await Task.Delay(1000);
}
});
}

在 Android 上,您可以使用以下代码:

public async Task RunCodeInBackgroundMode(Func<Task> action, string name = "MyBackgroundTaskName")
{
var powerManager = (PowerManager)Application.Context.GetSystemService(Context.PowerService);
var wakeLock = powerManager.NewWakeLock(WakeLockFlags.Partial,
name);
//acquire a partial wakelock. This prevents the phone from going to sleep as long as it is not released.
wakeLock.Acquire();
var taskEnded = false;

await Task.Factory.StartNew(async () =>
{
//here we run the actual code
Console.WriteLine($"Background task '{name}' started");
await action();
Console.WriteLine($"Background task '{name}' finished");
wakeLock.Release();
taskEnded = true;
});

await Task.Factory.StartNew(async () =>
{
//just a method to keep track of how long the task runs
var stopwatch = new Stopwatch();
stopwatch.Start();
while (!taskEnded)
{
Console.WriteLine($"Background '{name}' task with wakelock still running ({stopwatch.Elapsed.TotalSeconds} seconds)");
await Task.Delay(1000);
}
stopwatch.Stop();
});
}

在共享项目中,您可以通过以下方式调用这些方法:

var deviceInfoServic = ServiceLocator.Instance.Get<YourService Interface here>();
await deviceInfoServic.RunCodeInBackgroundMode(async () =>
{
//your code here
});

关于c# - Xamarin 表单后台任务仅在应用程序在 ios 上打开时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49542832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com