我没有看到使用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。
// 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);
}
}
我给出了一个基于这个AsyncTask
(也由Arseny Levin引用)来自Google Developer Advocate的Medium post的例子,但也应该可以使用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);
}
}
}
}
如果你的onStartJob()
方法返回true
,那意味着你在后台工作以支持这项工作。当该工作完成或者需要重新安排工作时,该后台线程需要调用jobFinished()
。
正如@CommonsWare所解释的那样 - 在onStartJob
中你将决定是否需要在后台线程上进一步工作。只有在这种情况下,才应该从该后台线程调用jobFinished
。只是为了回答您的具体问题 - 无需代表您进行条件跟踪。如果您提出的条件不再适用,JobService
将致电onStopJob
。
jobFinished
的例子可以在这里找到:https://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129