从intentservcie回调到jobservice

时间:2016-07-28 22:25:39

标签: android intentservice job-scheduling

我有一个jobcheduler触发了Jobservice的onStartjob。在onStartJob中,我启动了一个intentservice来完成这项工作。工作完成后,我希望intentservice对jobservice进行回调,以便可以调用onjobfinished。如何回复JobService?

2 个答案:

答案 0 :(得分:3)

您可以使用一些ACTION常量(例如Jobservice)创建BroadcastReceiver并在onStartJob() ACTION_DOWNLOAD_FINISHED方法中注册它。此接收方将所有工作委托给onJobFinished()方法:

public static final String ACTION_DOWLOAD_FINISHED = "actionDownloadFinished";

private BroadcastReceiver downloadFinishedReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) { 
        context.unregisterReceiver(this); //Unregister receiver to avoid receiver leaks exception
        onJobFinished();
    }
};

public void onStartJob() {
    IntentFilter filter = new IntentFilter(ACTION_DOWNLOAD_FINISHED);        
    //Use LocalBroadcastManager to catch the intents only from your app
    LocalBroadcastManager.getInstance(this).registerReceiver(downloadFinishedReceiver , filter);

    //other job starting stuff...
}

然后,在意图服务结束后,您可以通过ACTION_DOWNLOAD_FINISHED动作发送广播意图:

// ...downloading stuff
Intent downloadFinishedIntent = new Intent(Jobservice.ACTION_DOWNLOAD_FINISHED);
//Use LocalBroadcastManager to broadcast intent only within your app
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

当意图服务的工作完成时,它发送由在Jobservice中注册的接收者捕获的广播意图。接收器然后调用onJobFinished()方法。

您可以在那里找到详细信息:https://developer.android.com/training/run-background-service/report-status.html

答案 1 :(得分:-1)

我正在做同样的事情(启动IntentService的JobService),这就是我所做的:

简短的故事是我使用Handler和Handler.Callback,我可以将其作为Messenger传递给我的IntentService,以便IntentService可以向Handler.Callback发送一条消息来完成这项工作。 Handler.Callback可以看到我的JobService,因此它可以调用finishJob(...)。

public class MyJobService extends JobService implements Handler.Callback {

  private Handler mHandler = new Handler(this);

  public static final String BNDL_MESSENGER = "messenger";
  public static final String BNDL_PARAMS    = "params";

  public static final int FINISH_JOB_MESSAGE     = 100;
  public static final int NEEDS_RESCHEDULE_TRUE  = 0;
  public static final int NEEDS_RESCHEDULE_FALSE = 1;

  public boolean handleMessage(Message msg) {
    int msgType = msg.what;

    if (msgType == FINISH_JOB_MESSAGE) {
      int           jobId           = msg.arg1;
      JobParameters params          = (JobParameters)msg.obj;
      boolean       needsReschedule = (msg.arg2 == NEEDS_RESCHEDULE_TRUE);

      Log.i(TAG, "Finishing Job ID: " + jobId);
      jobFinished(params, needsReschedule);
    } else {
      Log.e(TAG, "Message type not supported: " + msgType);
    }    
  }

  @Override
  public boolean onStartJob(JobParameters params) {

    Intent intent = new Intent(this, MyIntentService.class);
    intent.putExtra(BNDL_MESSENGER, new Messenger(mHandler));
    intent.putExtra(BNDL_PARAMS, params);

    startService(intent);                      
  }
}

然后你的IntentService发回一条消息:

public class MyIntentService extends IntentService {
  @Override
  public void onHandleIntent(Intent intent) {
    Messenger messenger = (Messenger)intent.getParcelableExtra(MyJobService.BNDL_MESSENGER);
    JobParameters params = (JobParameters)intent.getParcelableExtra(MyJobService.BNDL_PARAMS);

    if (messenger != null) {
      Message msg = Message.obtain();
      msg.what = MyJobService.FINISH_JOB_MESSAGE;
      msg.arg1 = params.getJobId();
      msg.arg2 = MyJobService.NEEDS_RESCHEDULE_TRUE;
      msg.obj  = params;

      try {
        messenger.send(msg);
      } catch (RemoteException re) {
        Log.e(TAG, "Couldn't send message to finish job!", re);
      }
    }
  }
}