6

我正在尝试实现我的第一个 JobService。我知道调用onStartJob实际上是有保证的(是的,如果我在没有过期时间的情况下指定了一些令人发指的要求,那么会有一些优势)。但是怎么样onStopJob?能保证被调用吗?

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

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

ps 需要考虑的事情可能会有所帮助(我也在考虑):如果我的onStartJob返回为真,系统如何知道我的作业何时停止运行,除非它调用onStopJob

4

3 回答 3

8

情况:

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

请记住:
如果系统确定您必须停止执行作业,甚至在您有机会调用 jobFinished() 之前,就会调用 onStopJob()。

说明:
(1)(2)(3) 如果您通过在 onStartJob() 中返回 false 或通过调用 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() 来确定该工作已完成是不正确的。

于 2016-12-15T15:41:27.927 回答
4

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

我建议在您的工作完成时发送一条广播消息作为完成信号。

于 2016-07-02T11:46:52.153 回答
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中设置的约束(条件)不满足或条件不再满足时,应用程序知道作业已停止。

于 2020-02-19T09:29:36.820 回答