用于通知的Job Scheduler的Android后台服务

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

我正在使用Job Scheduler进行Android通知。我的代码工作正常。但有些时候我有两次通知。但我给出了服务运行的一分钟间隔。我将如何正确地完成服务?

这是我的Job Scheduler Code启动服务而我只使用服务。

JobScheduler jobScheduler =(JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE); ComponentName componentName = new ComponentName(getApplicationContext(),NotifyService.class);

            JobInfo jobInfo = new JobInfo.Builder(15,componentName)
                    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                    .setPeriodic(60000)
                    .setPersisted(true)
                    .build();

            jobScheduler.schedule(jobInfo);
service android-notifications job-scheduling android-jobscheduler
1个回答
0
投票

这可能是一个较晚的帖子,但您可以使用Android中的WorkManager来设置定期工作请求。

我一直在使用WorkManager,它似乎可靠地工作。

您可以阅读更多关于其他工作原语的内容以适合您的任务here,但是下面的实现使用Worker在WorkManager中进行线程化,它在后台线程上同步执行工作。

public class BackgroundWorker extends Worker {

    public BackgroundWorker
            (@NonNull Context context,
             @NonNull WorkerParameters params) {
             super(context, params);
    }

    @NonNull
    @Override
    public Worker.Result doWork() {     
        yourBackgroundTask();  // yourBackgroundTask() implementation
        return Result.success();
    }

    public static void schedulePeriodicWork(Data data) {
        // When multiple constraints are specified like below, 
        // your task will run only when all the constraints are met.
        Constraints constraints = new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .setRequiresBatteryNotLow(true)
                        .setRequiresCharging(true)
                        .build();

        PeriodicWorkRequest taskWork = new PeriodicWorkRequest.Builder(BackgroundWorker.class, 60,
                TimeUnit.MINUTES)
                .setConstraints(constraints)
                .setInputData(data)
                .build();

        WorkManager.getInstance().enqueue(taskWork);
    } 
}

稍后在您的MainActivity文件中,在onCreate()中:

Data data = workData();

BackgroundWorker.schedulePeriodicWork(data);

然后在onCreate()方法之外,

private Data workData() {
    return new Data.Builder() // to build Data objects
        .build();
}

需要注意的一点是,尽管我们将上述任务设置为每60分钟执行一次,但每次迭代可能不会以相同的时间间隔执行。

根据Android文档,WorkManager适用于可延迟的工作,必须容忍一些漂移。但是,您可以检查日志控制台以获取更新“WM-WorkerWrapper: Worker result SUCCESS for Work”。

希望这是有帮助的。

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