如何在Xamarin Android中实现JobScheduler

3
我正在开发一个Xamarin Forms项目,我想在Android项目中创建一个后台服务。有位朋友建议使用 JobDispatcher
我已经找到了标记为未上架的Xamarin NuGet包https://www.nuget.org/packages/Xamarin.Firebase.JobDispatcher。当我使用Android.App.Job.JobService时,它运行得非常完美,但只能在本地进程中使用。如果该进程中有任何调用服务器的代码,则服务将停止。
public static class NotificationsJobInfo
{
    public static JobInfo.Builder CreateJobBuilderUsingJobId<T>(this Context context, int jobId) where T : JobService
    {
        var javaClass = Java.Lang.Class.FromType(typeof(T));
        var componentName = new ComponentName(context, javaClass);
        return new JobInfo.Builder(jobId, componentName);
    }
}

在 MainActivity 中:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.Main);
    StartNotificationsJob();
}

private void StartNotificationsJob()
{
    try
    {
        Intent intent = new Intent(this, typeof(MainActivity));
        var jobBuilder = this.CreateJobBuilderUsingJobId<MainJob>(1);
        JobInfo jobInfo = jobBuilder
                .SetOverrideDeadline(15*60*1000)
                //.SetRequiredNetworkType(NetworkType.Any)
                //.SetMinimumLatency(15 * 60 * 1000)
                //.SetPeriodic(15 * 60 * 1000)//,1000)
                .Build();

        JobScheduler jobScheduler = (JobScheduler)GetSystemService(JobSchedulerService);
        var result = jobScheduler.Schedule(jobInfo);
    }
    catch (Exception ex)
    {
    }
}

还有一个Job类:

[Service(Name = "XXXXXXXXXXXXXX.MainJob", Permission = "android.permission.BIND_JOB_SERVICE")]
public class MainJob : JobService
{
    public override bool OnStartJob(JobParameters @params)
    {
        Task.Run(() =>
        {
           //Do Some Process

        });
        return true;
    }

    public override bool OnStopJob(JobParameters @params)
    {
        return false;
    }
}

我需要制作一个后台服务,它可以持续运行并保持与服务器的通信,即使应用程序已被关闭。


1
尝试一下:https://devblogs.microsoft.com/xamarin/getting-started-workmanager/ - Karan Rami
1个回答

4

建议使用Xamarin的WorkManager,这将是最佳选择。你可以在这里找到一个介绍WorkManager的博客文章

Xamarin的博客上有一篇新的关于这个主题的文章:入门指南:使用WorkManager

请记住,如果强制停止应用,则后台工作只会在用户再次启动应用程序后才会恢复。但是,WorkManager将跟踪工作并永远不会丢失任何工作内容。

你可以参考WorkManager文档中的其他信息。请注意,WorkManager(如JobScheduler)具有最小周期间隔为15分钟,这不是精确的延迟,而只是最小间隔。


我昨天点赞了这个答案,但现在我认为我应该踩它,但我做不到。我现在发现,虽然WorkManager被设计为在后台运行,但在大多数设备上并不是这样的。请参见链接 - quilkin
WorkManager遵守一般的Android操作系统规则(强制停止应用程序会删除其所有闹钟/作业,直到用户手动再次启动该应用程序)。除此之外,还有OEM对原始Android操作系统进行修改,以限制后台应用程序(https://dontkillmyapp.com/)。WorkManager没有比普通应用程序更多的权限。话虽如此,您不能指望应用程序在没有用户干预的情况下无限期地在后台运行:https://developer.android.com/topic/performance/power/power-details - pfmaggi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接