Android:如何使用JobService的JobFinished

时间:2017-06-14 20:33:57

标签: java android android-jobscheduler jobservice

我没有看到使用JobService的JobFinshed的例子,看起来我们必须跟踪某些条件遇到的变化我们必须调用jobFinished(),对吗?

4 个答案:

答案 0 :(得分:4)

jobFinished()这样的其他类调用IntentService的难度似乎是让您的类的实例扩展JobService以用于调用jobFinished()。您可以获得有关预定作业的信息,但不能获取JobService上的信息(至少,我找不到方法)。我可以想出三种方式来呼叫jobFinished()

如果您不关心您的工作是否成功,或者您的工作需要的时间很短。

在我的一个JobService课程中,我正在做定期工作。我并不担心处理失败。任务将很快再次执行。如果是这种情况,您可以这样做。

    public boolean onStartJob(JobParameters params) {
        startService(new Intent(this, MyIntentServiceThatDoesTheWork.class));

        // job not really finished here but we assume success & prevent backoff procedures, wakelocking, etc.
        jobFinished(params, false);
        return true;
    }

如果你的工作足够短,这也是你想要的方式,在UI线程上做这件事没问题。在这种情况下,请在onStartJob()中完成所有工作,然后返回false。

使用BroadcastReceiver将消息从IntentService发送到JobService(每个类的单独文件)。

    // common Strings
    public static final String IS_SUCCESS = "isSuccess";
    public static final String MY_BC_RCVR = "MyBroadcastRcvr";

您的JobService

    public class MyJobService extends JobService {
        JobParameters mParams;

        public boolean onStartJob(JobParameters params) {
            mParams = params;
            LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
                    new IntentFilter(MY_BC_RCVR));
            startService(new Intent(this, MyIntentServiceThatDoesTheWork.class));
            return true;
        }

        private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                boolean isSuccess = false;
                if(intent.hasExtra(IS_SUCCESS)) {
                    isSuccess = intent.getBooleanExtra(IS_SUCCESS, false);
                }
                LocalBroadcastManager.getInstance(context).unregisterReceiver(this);
                jobFinished(mParams, !isSuccess);
            }
        };
    }

&安培;你的IntentService

    public class MyIntentServiceThatDoesTheWork extends IntentService {
        @Override
        protected void onHandleIntent(Intent intent) {

            boolean isSuccess = methodToDoAllMyWork();
            Intent bcIntent = new Intent(MY_BC_RCVR);
            bcIntent.putExtra(IS_SUCCESS, isSuccess);
            LocalBroadcastManager.getInstance(this).sendBroadcast(bcIntent);
        }
    }

将您的工作线程类嵌套在JobService类中。

我已经从Google Developer Advocate给出了基于此Medium post(也由Arseny Levin引用)AsyncTask的示例,但也应该可以使用{{1} (请参阅此SO post以嵌套IntentService)。

IntentService

答案 1 :(得分:3)

如果您的onStartJob()方法返回true,则表示您正在后台工作以支持此作业。当该工作完成或者需要重新安排工作时,该后台线程需要调用jobFinished()

答案 2 :(得分:1)

正如@CommonsWare所解释的那样 - 在onStartJob内,您将决定后台线程是否需要进一步的工作。只有在这种情况下,才应该从该后台线程调用jobFinished。 只是为了回答您的具体问题 - 无需代表您进行条件跟踪。如果您提出的条件不再适用,JobService会致电onStopJob

jobFinished的示例可以在这里找到: https://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129

答案 3 :(得分:0)

一种简单的方法是从onStartJob启动一个新线程,如下所示:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(final JobParameters params) {
      new Thread(new Runnable() {
        @Override
        public void run() {

            // do your job here

            jobFinished(params, true);
        }
      }).start();

      return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
      return true;
    }
}