如果应用程序被杀,Job Scheduler将无法正常工作

时间:2017-10-16 13:16:04

标签: android android-jobscheduler

我已经看过很多其他线程。但是,这似乎都没有帮助。

我需要设置每天下午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点执行一次任务。

3 个答案:

答案 0 :(得分:1)

对于长时间的应用程序被杀死后,后台任务,您需要实现AlarmManagerWorkManagerWorkManager处于测试阶段,但现在仅适用于Android X,只需实现依赖关系并从Google复制粘贴WorkManager类代码,然后执行任务即可。

WorkManager最新依赖项:

 implementation "androidx.work:work-runtime:2.2.0"

答案 1 :(得分:0)

我找到了这篇文章。这里它说你必须在asyncTask的onPostExecute方法中调用jobFinished(),让系统知道作业已完成。

  

jobFinished()需要两个参数:当前作业,以便它   知道哪个唤醒锁可以被释放,一个布尔值表示是否   你想重新安排工作。如果你传入真实,这将踢   关闭JobScheduler的指数退避逻辑

我希望它有所帮助。

Scheduling jobs like a pro with JobScheduler

答案 2 :(得分:0)

有一个选项不杀死应用程序,但这是很不礼貌的,而且是hack: 在清单->内部活动代码->添加以下行

android:excludeFromRecents="true"

您的应用未显示在最近的应用历史中。因此用户无法终止该应用。

信息可通过以下方式获得:https://code-examples.net/en/q/26c6cf8