Я пытаюсь вызвать JobService из широковещательного приемника на основе полученных пользовательских широковещательных сообщений. Теперь я использовал один JobService с несколькими идентификаторами в зависимости от типа полученного широковещательного сообщения.
Вот код моего Broadcast Receiver.
public class SampleBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Objects.equals(intent.getAction(), "com.example.BroadCastA")) {
if(isJobServiceBOn(context){
StopALLJobService(context)
StartJobServiceA()
}else{
StartJobServiceA()
}
}else if(Objects.equals(intent.getAction(), "com.example.BroadCastB")){
if(isJobServiceAOn(context){
StopALLJobService(context)
StartJobServiceB()
}else{
StartJobServiceB()
}
}
}
private void StartJobServiceA(){
ComponentName serviceComp = new ComponentName(context, ExampleJobService.class);
PersistableBundle bundle = new PersistableBundle();
JobInfo.Builder JobInfor = new JobInfo.Builder(1, serviceComp);
JobInfor.setMinimumLatency(100);
JobInfor.setPersisted(true);
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
if (jobScheduler != null) {
jobScheduler.schedule(JobInfor.build());
}
}
private void StartJobServiceB(){
ComponentName serviceComp = new ComponentName(context, ExampleJobService.class);
PersistableBundle bundle = new PersistableBundle();
JobInfo.Builder JobInfor = new JobInfo.Builder(2, serviceComp);
JobInfor.setMinimumLatency(100);
JobInfor.setPersisted(true);
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
if (jobScheduler != null) {
jobScheduler.schedule(JobInfor.build());
}
}
public static boolean isJobServiceAOn( Context context ) {
JobScheduler scheduler = (JobScheduler) context.getSystemService( Context.JOB_SCHEDULER_SERVICE ) ;
boolean hasBeenScheduled = false ;
if (scheduler != null) {
for ( JobInfo jobInfo : scheduler.getAllPendingJobs() ) {
if ( jobInfo.getId() == 1 ) {
hasBeenScheduled = true ;
break ;
}
}
}
return hasBeenScheduled ;
}
public static boolean isJobServiceBOn( Context context ) {
JobScheduler scheduler = (JobScheduler) context.getSystemService( Context.JOB_SCHEDULER_SERVICE ) ;
boolean hasBeenScheduled = false ;
if (scheduler != null) {
for ( JobInfo jobInfo : scheduler.getAllPendingJobs() ) {
if ( jobInfo.getId() == 2 ) {
hasBeenScheduled = true ;
break ;
}
}
}
return hasBeenScheduled ;
}
private void StopALLJobService(Context context){
JobScheduler jobSchedule = (JobScheduler) context.getSystemService( Context.JOB_SCHEDULER_SERVICE ) ;
if (jobSchedule != null) {
jobSchedule.cancelAll();
}
Log.i(TAG,"Jobservice cancelled due to either BroadcastA or BroadcastB");
}
}
}
А вот класс JobService
public class ExampleJobService extends JobService {
private int JobID;
@Override
public boolean onStartJob(JobParameters params) {
JobID = params.getJobId();
switch(JobID){
case 1:
taskA;
break;
case 2:
taskB;
break;
}
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.d(TAG,"Jobservice terminated by system");
return true;
}
}
Сам код работает отлично. Но я не знаю, является ли это правильным способом использования JobService или мне следует использовать два разных класса JobService, основанных на полученном широковещательном сообщении.