我正在创建一个应用程序,其中将在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();
}