シナリオ
こんにちは、HomeScreen に来たときに起動する JobService があります。このジョブ サービスは、DB から要求を取得し、インターネットが利用可能なときはいつでも実行します。そのため、デバイスがオフラインの場合でも、DB にトランザクションを挿入すると、インターネットが接続されるたびに JobService がそれらのトランザクションを実行します。
問題
問題は、多くの画面から HomeScreen にアクセスすることです。そのため、HomeScreen にアクセスするたびに、JobService を再起動します。したがって、インターネットが来る前にホームスクリーンに 3 回アクセスした場合、同じタスクに対して 3 つの異なるサービスが実行されています。そのため、サービスが既に実行されているかどうかを確認したかったので、サービスを開始しません。
私が試したこと
JobService を開始するコードは非常に単純です。私はそれを開始して呼び出すメソッドを書きましたOnCreate()
public JobScheduler initQueue(Context context){
if(jobScheduler==null){
jobScheduler = (JobScheduler)context.getSystemService(JOB_SCHEDULER_SERVICE);
}
return jobScheduler;
}
public void executeQueue(){
initQueue(this);
ComponentName jobService = new ComponentName(this.getPackageName(), OfflineQueueService.class.getName());
JobInfo jobInfo = new JobInfo.Builder(2,jobService).
setPersisted(true).
setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).
build();
jobScheduler.schedule(jobInfo);
}
私は電話をかけexecuteQueue
ますonCreate()
。StackOverflow で検索したところ、次のリンクが見つかりました。
AndroidでJobServiceが実行されているかどうかを確認するには? .
したがって、JoService が実行されているかどうかを確認するために、HomeScreen に次のメソッドがあります。
public static boolean isJobServiceOn( Context context ) {
JobScheduler scheduler = (JobScheduler) context.getSystemService( Context.JOB_SCHEDULER_SERVICE ) ;
boolean hasBeenScheduled = false ;
List<JobInfo> list =scheduler.getAllPendingJobs();
for ( JobInfo jobInfo : scheduler.getAllPendingJobs() ) {
if (jobInfo.getId() == 2 ) {
hasBeenScheduled = true ;
break ;
}
}
return hasBeenScheduled ;
}
しかし、この方法では、実行中の JobService がリストされることはなく、毎回表示false
されるため、JobService の複数のインスタンスという同じ問題が再び発生します。
私の質問が明確になったことを願っています。