无法停止 Firebase JobDispatcher 服务
Cant stop Firebase JobDispatcher service
Possible Duplicate
我已经创建了一个 JobDispatcher 服务来保持在后台获取用户位置和 post 将用户位置发送到服务器。为此,我创建了一个作业如下:
private void startLocationJobService() {
// Check if location job service already running
if(!isMyServiceRunning(LocationJobService.class)) {
Context context = config.getActivity();
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
Job job = dispatcher.newJobBuilder()
.setLifetime(Lifetime.FOREVER)
.setService(LocationJobService.class)
.setTag(JOB_SERVICE_TAG)
.setReplaceCurrent(true)
.build();
//creating new job and adding it with dispatcher
dispatcher.mustSchedule(job);
}
}
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) config.getActivity().getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
在服务的 onStartJob 中,我正在配置位置 api 以获取用户位置
public boolean onStartJob(final JobParameters job) {
Log.i("TAG", "Service Run onStartJob called");
configureFusedLocation(LocationJobService.this);
return true;
}
服务启动并按预期保持 运行。但它并没有停止。我已经使用两种方式(dispatcher.cancel 和 stopService)来停止服务,如下所示:
public void stopService() {
if(isMyServiceRunning(LocationJobService.class)) {
config.getActivity().stopService(new Intent(config.getActivity(), LocationJobService.class));
cancelLocationJobService();
}
}
private void cancelLocationJobService(){
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(config.getActivity()));
// Cancel the job for this tag
dispatcher.cancel(JOB_SERVICE_TAG);
//Cancel all the jobs for this package
dispatcher.cancelAll();
}
您需要取消注册位置侦听器并在 LocationJobService 中调用 jobFinished()
来取消作业本身。
因为 dispatcher.cancelAll()
仅适用于取消 尚未 运行 的计划作业。
您可以使用 Eventbus
等工具来通知服务何时停止。
参考https://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129了解更多信息。
Possible Duplicate
我已经创建了一个 JobDispatcher 服务来保持在后台获取用户位置和 post 将用户位置发送到服务器。为此,我创建了一个作业如下:
private void startLocationJobService() {
// Check if location job service already running
if(!isMyServiceRunning(LocationJobService.class)) {
Context context = config.getActivity();
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
Job job = dispatcher.newJobBuilder()
.setLifetime(Lifetime.FOREVER)
.setService(LocationJobService.class)
.setTag(JOB_SERVICE_TAG)
.setReplaceCurrent(true)
.build();
//creating new job and adding it with dispatcher
dispatcher.mustSchedule(job);
}
}
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) config.getActivity().getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
在服务的 onStartJob 中,我正在配置位置 api 以获取用户位置
public boolean onStartJob(final JobParameters job) {
Log.i("TAG", "Service Run onStartJob called");
configureFusedLocation(LocationJobService.this);
return true;
}
服务启动并按预期保持 运行。但它并没有停止。我已经使用两种方式(dispatcher.cancel 和 stopService)来停止服务,如下所示:
public void stopService() {
if(isMyServiceRunning(LocationJobService.class)) {
config.getActivity().stopService(new Intent(config.getActivity(), LocationJobService.class));
cancelLocationJobService();
}
}
private void cancelLocationJobService(){
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(config.getActivity()));
// Cancel the job for this tag
dispatcher.cancel(JOB_SERVICE_TAG);
//Cancel all the jobs for this package
dispatcher.cancelAll();
}
您需要取消注册位置侦听器并在 LocationJobService 中调用 jobFinished()
来取消作业本身。
因为 dispatcher.cancelAll()
仅适用于取消 尚未 运行 的计划作业。
您可以使用 Eventbus
等工具来通知服务何时停止。
参考https://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129了解更多信息。