我有一个jobcheduler触发了Jobservice的onStartjob。在onStartJob中,我启动了一个intentservice来完成这项工作。工作完成后,我希望intentservice对jobservice进行回调,以便可以调用onjobfinished。如何回复JobService?
答案 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);
}
}
}
}