我正在尝试实现我的第一个JobService。我理解对onStartJob
的调用几乎得到了保证(是的,如果我在没有到期时间的情况下指定一些令人发指的要求,则会有一些优势)。但onStopJob
怎么样?是否保证被称为?
具体来说,我有一份将在后台执行的工作。但我有办法知道工作何时完成(例如sharedPrefs)。我希望在调用onStopJob时依赖于向用户发送作业已完成的通知。
注意:onStopJob是发送通知的一个方便的地方,因为我已经在检查作业是否完成,以便知道我是否应该重试。
P.S。需要考虑的事情可能有所帮助(我也在考虑):如果我的onStartJob
返回true,系统如何知道我的工作何时停止运行,除非它调用onStopJob
?
答案 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中设置的约束(条件)不满足或者该条件不再满足时,应用程序就知道该作业已停止。