3

シナリオ

こんにちは、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 の複数のインスタンスという同じ問題が再び発生します。

私の質問が明確になったことを願っています。

4

0 に答える 0