JobScheduler Service在从最近清除时停止,并在setPeriodic超时时再次启动

时间:2018-08-05 04:41:54

标签: android android-service job-scheduling

我正在创建一个应用程序,其中将在MainActivity中启动 JobService 服务。当应用程序处于前台时,该应用程序将按预期运行,但是当我从最近的应用程序中清除该应用程序时,该服务将不响应,甚至不会调用 onStopJob setPeriodic(1000 * 60 * 15)时间到期后,服务甚至无法执行。 在onStartJob方法中,我创建一个单独的线程并执行一些网络和数据库任务。对于网络活动,我使用JSOUP库。

这是代码: 此功能在 MainActivity 中调用:

private void startJobScheduler() {
    ComponentName componentName = new ComponentName(this, MyJobService.class);
    JobInfo info = new JobInfo.Builder(123, componentName)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
            .setPersisted(true)
            .setRequiresCharging(false)
            .setRequiresDeviceIdle(false)
            .setPeriodic(1000 * 60 * 15)
            .build();
    JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
    if (scheduler != null) {
        scheduler.schedule(info);
    }
}

JobService代码:

 @Override
public boolean onStartJob(JobParameters params) {
    Log.d("TAG", "Job started");
    doBackgroundWork(params);
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    Log.d("TAG", "Job stopped");
    isCancelled = true;
    return false;
}
private void doBackgroundWork(final JobParameters params) {
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            Log.d("TAG", "Job thread started");
            Document document;
            boolean flag;
            SarkariPage sarkariPage;
            ArrayList<Anchor> anchorList;
            NotificationCheckerDatabase checkerDatabase = new NotificationCheckerDatabase(MyJobService.this);
            NotificationDatabaseHelper notificationDatabaseHelper = new NotificationDatabaseHelper(MyJobService.this);
            for (final Anchor anchor : myanchors) {
                Log.d("TAG", "Job anchor " + anchor.getText());
                flag = false;
                if (isCancelled) {
                    return;
                }
                initiate(anchor);
                try {
                    if ((document = Jsoup.connect(anchor.getHref()).userAgent("Mozilla").get()) != null) {
                        sarkariPage = new SarkariPage(MyJobService.this, document);
                        anchorList = sarkariPage.getAnchors();

                        if (checkerDatabase.getJobsCount(LATEST) == 0) {
                            for (Anchor a : anchorList) {
                                checkerDatabase.insertJob(LATEST, a.getText(), a.getHref());
                            }
                        } else {
                            for (Anchor a1 : anchorList) {
                                if (!checkerDatabase.isJobExists(LATEST, a1.getText(), a1.getHref())) {
                                    flag = true;
                                    sendNotification(a1.getText(), a1.getHref());
                                    notificationDatabaseHelper.insertJob(a1.getText(), a1.getHref());
                                }
                            }
                            if (flag) {
                                checkerDatabase.deleteAllJob(LATEST);
                                for (Anchor a : anchorList) {
                                    checkerDatabase.insertJob(LATEST, a.getText(), a.getHref());
                                }
                            }
                        }
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            Log.d("TAG", "Job finished");
            jobFinished(params, false);
        }
    });
    t.setPriority(Thread.MIN_PRIORITY);
    t.start();
}

0 个答案:

没有答案