我有一个作业调度程序,可以触发作业服务的onStartjob。在onStartJob中,我启动了一个intentservice来完成这项工作。工作完成后,我想让intentservice回调jobservice,这样就可以调用onjobfinished了。如何回调JobService?
发布于 2016-07-29 04:11:12
您可以使用一些动作常量(例如ACTION_DOWNLOAD_FINISHED
)在onStartJob()
方法的Jobservice
中创建BroadcastReceiver并注册它。此接收器将把所有工作委托给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
发布于 2016-09-04 17:35:58
我正在做同样的事情(启动IntentService的JobService),下面是我所做的:
简单地说,我使用了一个带有Handler.Callback的处理程序,我可以将它作为信使传递给我的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);
}
}
}
}
https://stackoverflow.com/questions/38647733
复制