我已经看过很多其他线程。但是,这似乎都没有帮助。
我需要设置每天下午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();
}
}
Everythings似乎工作正常,我按照上面的设置每5秒收到一次toast留言Task run
。
但是当应用被杀死时(通过清除多任务窗口中的所有任务),我停止接收toast消息。
即使应用程序被杀,如何让它继续运行?
P.S:我希望每天下午3点执行一次任务。答案 0 :(得分:1)
对于长时间的应用程序被杀死后,后台任务,您需要实现AlarmManager
或WorkManager
。 WorkManager
处于测试阶段,但现在仅适用于Android X,只需实现依赖关系并从Google复制粘贴WorkManager
类代码,然后执行任务即可。
WorkManager
最新依赖项:
implementation "androidx.work:work-runtime:2.2.0"
答案 1 :(得分:0)
我找到了这篇文章。这里它说你必须在asyncTask的onPostExecute方法中调用jobFinished(),让系统知道作业已完成。
jobFinished()需要两个参数:当前作业,以便它 知道哪个唤醒锁可以被释放,一个布尔值表示是否 你想重新安排工作。如果你传入真实,这将踢 关闭JobScheduler的指数退避逻辑
我希望它有所帮助。
答案 2 :(得分:0)
有一个选项不杀死应用程序,但这是很不礼貌的,而且是hack: 在清单->内部活动代码->添加以下行
android:excludeFromRecents="true"
您的应用未显示在最近的应用历史中。因此用户无法终止该应用。
信息可通过以下方式获得:https://code-examples.net/en/q/26c6cf8