在Android上,onStopJob总是被称为?

时间:2016-06-07 21:19:13

标签: android job-scheduling android-jobscheduler

我正在尝试实现我的第一个JobService。我理解对onStartJob的调用几乎得到了保证(是的,如果我在没有到期时间的情况下指定一些令人发指的要求,则会有一些优势)。但onStopJob怎么样?是否保证被称为?

具体来说,我有一份将在后台执行的工作。但我有办法知道工作何时完成(例如sharedPrefs)。我希望在调用onStopJob时依赖于向用户发送作业已完成的通知。

注意:onStopJob是发送通知的一个方便的地方,因为我已经在检查作业是否完成,以便知道我是否应该重试。

P.S。需要考虑的事情可能有所帮助(我也在考虑):如果我的onStartJob返回true,系统如何知道我的工作何时停止运行,除非它调用onStopJob

3 个答案:

答案 0 :(得分:6)

<强>情况:

  

(1)onStartJob()返回false。
(2)系统收到取消请求   在onStartJob()之后返回false。(例如,调用   jobScheduler.cancelAll();在onStartJob()返回之后。)
(3)调用   jobFinished(参数,可以假); onStartJob()后不久返回true   (4)onStartJob()返回true并且不再满足要求。   
(5)在onStartJob()之后调用jobScheduler.cancelAll()返回true;

请记住:
如果系统确定您,则调用onStopJob()  必须在你有机会打电话给jobFinished()之前停止执行你的工作。

<强>说明:
(1)(2)(3)如果您通过onStartJob()或通过调用jobFinished()告诉系统您已完成工作,系统将不会为您的工作调用onStopJob(),因为系统不需要。

(4)系统将为您调用onStopJob(),但是在满足要求后需要很长时间,可能是1分钟(在小米4c上测试)。

(5)系统会为你调用onStopJob()。

您的问题:
(1)how does the system know when my job stops running unless it calls onStopJob? 您可以调用jobFinished()或在onStartJob()中返回false,让系统知道您已完成工作。

(2)Is it guaranteed to be called? 这取决于情况。因此依靠onStopJob()来确定作业已经完成是不正确的。

答案 1 :(得分:4)

根据document,当系统决定在完成之前强行停止你的工作时,会调用onStopJob。您无法使用此API来满足您的需求。

我建议在你的工作完成时发送广播信息作为完成信号。

答案 2 :(得分:1)

当您在onstartjob()中返回true时

 public boolean onStartJob(JobParameters jobParameters) {
        Toast.makeText(getApplicationContext(),
               "MyJobService.onStartJob()",
                Toast.LENGTH_SHORT).show();
        Log.d("KRN","KRANTHU: ");
        /*
         * True - if your service needs to process
         * the work (on a separate thread).
         * False - if there's no more work to be done for this job.
         */
        return true;
    }

只有这样,API才会调用onstop()函数。当您在onstartjob中返回false时 (),它认为作业已完成,并且未调用onstopjob()。

您的问题->系统如何知道我的工作何时停止

当您在jobinfo中设置的约束(条件)不满足或者该条件不再满足时,应用程序就知道该作业已停止。