Call back to service from intentservcie

I have a jobcheduler that runs onStartjob of Jobservice. In onStartJob, I run intenservice to get the job done. After the work is completed, I want the intenservice to call the job service so that onjobfinished can be called. How can I make a callback for JobService?

+4
source share
2 answers

You can create BroadcastReceiver and register it in the method Jobservice, onStartJob()using some constant ACTION (for example ACTION_DOWNLOAD_FINISHED). This receiver delegates all the work to the method 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);

, , , . onJobFinished().

: https://developer.android.com/training/run-background-service/report-status.html

+3

(JobService, IntentService), :

, Handler.Callback, IntentService Messenger, IntentService .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);
      }
    }
  }
}
-1

Source: https://habr.com/ru/post/1649472/


All Articles