我看过很多其他帖子。但是,这些都似乎没有帮助。
我需要设置一个作业调度程序,每天下午3点运行。
以下是我的服务类:
public class AttendanceCheckScheduler extends JobService {
private AttendanceCheckTask mAttendanceCheckTask;
private static final String TAG = "AttendanceCheckScheduler";
@Override
public boolean onStartJob(JobParameters params) {
mAttendanceCheckTask = new AttendanceCheckTask();
mAttendanceCheckTask.execute();
jobFinished(params, false);
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
mAttendanceCheckTask.cancel(true);
return false;
}
private class AttendanceCheckTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// some long running task...
Toast.makeText(getApplicationContext(), "Task run", Toast.LENGTH_SHORT).show();
return null;
}
@Override
protected void onPostExecute(Void s) {
super.onPostExecute(s);
}
}
}
这是我在ActivityHome中如何安排工作的方式。
public class ActivityHome extends AppCompatActivity {
private static final int JOB_ID = 100;
private JobScheduler jobScheduler;
protected JobInfo jobInfo;
private static final String TAG = "ActivityHome";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
// other irrelevant codes here...
ComponentName componentName = new ComponentName(this, AttendanceCheckScheduler.class);
JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, componentName);
builder.setPeriodic(5000); // every 5 seconds for testing purpose...
builder.setPersisted(true);
jobInfo = builder.build();
jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(jobInfo);
Toast.makeText(this, "job scheduled", Toast.LENGTH_LONG).show();
}
}
一切似乎都正常工作,我正在按照上面设置的每5秒接收到toast消息任务运行
。
但是当应用程序被杀死(通过清除多任务窗口中的所有任务),我就停止接收toast消息了。
如何即使应用程序被杀死也让它继续运行?
P.S:我希望某些任务每天下午3点执行一次。
JobService
。你没有调用jobFinished()
(这是必须的),而且你不应该使用AsyncTask
(使用普通线程或其他不涉及主应用程序线程的东西)。一般来说,一个写得好的JobService
不应该受到概览屏幕的影响。然而,一些设备制造商有自己的任务管理器,它们的行为类似于强制停止(在设置中你的应用程序页面上的按钮),并且会取消作业。对于这些设备,你几乎无能为力。 - CommonsWareJobScheduler
在特定的下午3点执行某些操作,您的5秒轮询周期不适用于所有Android版本,并且使用Toast
进行诊断不是一个好主意(请使用LogCat)。 - CommonsWare