我正在开发一个应用程序,该应用程序需要一个定期的后台线程并且即使在关闭该应用程序或重新启动手机后仍可以运行。
任务是获取实际位置(GPS)并将其与一些本地数据进行比较,而无需联网。当用户位于特定位置时,我会显示一条通知。
我的问题是,我不知道使用哪种方法。我阅读了一些有关JobScheduler,AlarmManager,IntentService等的文章,但实际上并没有真正运行过,每60秒更新一次,这是在自己的线程中进行的。 编辑:我也不想一直收到即时通知。
我该怎么办?
谢谢!
代码:
在此代码中,我的服务在自己的线程中运行。代码被正确执行。
公共类LocationNotificationService扩展JobService {
public static final String TAG = "AppService";
private boolean jobCancelled = false;
@Override
public boolean onStartJob(JobParameters params) {
Log.d(TAG, "Job started");
doBackgroundWork(params);
return true;
}
private void doBackgroundWork(JobParameters params) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0; i<20;i++) {
if (jobCancelled) {
return;
}
Log.d(TAG, "RUN" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d(TAG, "Job Finished");
jobFinished(params, false);
}
}).start();
}
@Override
public boolean onStopJob(JobParameters params) {
Log.d(TAG, "Job canceled before done");
jobCancelled = true;
return true;
}
}
问题是我的MainActivity中调度程序的配置:
private void startLocationNotificationService() {
ComponentName name = new ComponentName(this, LocationNotificationService.class);
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, name)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.setPeriodic(15 * 60 * 1000)
.build();
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
int resultCode = scheduler.schedule(jobInfo);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.d(TAG, "Job scheduled");
} else {
Log.d(TAG, "Job scheduling failed");
}
}
我只能每15分钟更新一次。每次15岁以下将自动设置为此时间。我需要更频繁地更新。