我没有看到使用JobService的jobFinshed的示例,似乎我们必须在满足某些条件时跟踪更改,我们必须调用jobFinished()
方法,对吗?
最佳答案
从另一个类(例如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
的,但也应该可以使用IntentService
(请参见此SO post嵌套IntentService
)。 public class MyJobService extends JobService {
JobParameters mParams;
public boolean onStartJob(JobParameters params) {
mParams = params;
new MyAsyncTaskThatDoesTheWork().execute();
return true;
}
private class MyAsyncTaskThatDoesTheWork extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
return methodToDoAllMyWork();
}
@Override
protected void onPostExecute(Boolean isSuccess) {
if(mParams != null) {
jobFinished(mParams, !isSuccess);
}
}
}
}