Android:如何使用 JobFinished of JobService



我没有看到使用 JobService 的 jobFinshed 的示例,似乎我们必须在满足某些条件时跟踪更改,我们必须调用jobFinished()方法,对吗?

从另一个类(如IntentService)调用jobFinished()的困难似乎是获得一个扩展JobService用于调用jobFinished()的类实例。 您可以获取有关计划作业的信息,但不能获取有关JobService的信息(至少,我找不到方法)。 我可以想到 3 种打电话给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 类中。

我给出了一个基于谷歌开发者倡导者的 Medium 帖子(也被 Arseny Levin 引用)的AsyncTask示例,但也应该可以使用IntentService(请参阅此 SO 帖子以获取嵌套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()

一个简单的方法是从onStartJob启动一个新线程,如下所示:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class MyJobService extends JobService {
@Override
public boolean onStartJob(final JobParameters params) {
new Thread(new Runnable() {
@Override
public void run() {
// do your job here
jobFinished(params, true);
}
}).start();
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
return true;
}
}

正如@CommonsWare解释的那样 - 在onStartJob内部,您将决定是否需要在后台线程上进行进一步的工作。只有在这种情况下,您才应该从该后台线程调用jobFinished。 只是为了回答您的具体问题 - 不需要代表您进行条件跟踪。 如果您提出的条件不再成立,JobService会打电话onStopJob

可以在此处找到jobFinished示例: https://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129

相关内容

  • 没有找到相关文章

最新更新