2016-09-22 6 views
7

私の質問の一部は、「ノーガット」で15分以下の間隔で仕事をセットアップする方法は、彼の答えでは「ブリザード」によって答えられました:
Job Scheduler not running on Android N
彼は問題を説明し、次の回避策を使用することが提案:アンドロイドNのジョブスケジューラで、15分未満の間隔で

JobInfo jobInfo; 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
    jobInfo = new JobInfo.Builder(JOB_ID, serviceName) 
     .setMinimumLatency(REFRESH_INTERVAL) 
     .setExtras(bundle).build(); 
} else { 
    jobInfo = new JobInfo.Builder(JOB_ID, serviceName) 
     .setPeriodic(REFRESH_INTERVAL) 
     .setExtras(bundle).build(); 
}  

しかし、提案

.setMinimumLatency(REFRESH_INTERVAL)  

を使用して一度だけジョブを開始します。
(ハンドラやアラームマネージャーを使用しないで)アンドロイドのヌガーデバイスで約30秒の周期で定期的に取得するにはどうすればよいですか?

+2

アプリがフォアグラウンドにあり、ユーザーが積極的に使用している場合を除き、30秒ごとに何かをするのは、バックグラウンドアプリによるバッテリー消費について大声で訴えているユーザーの目には不適切です。 – CommonsWare

+0

しかし、あなたが電話を始めるときに最新の情報を入手したいと思っているユーザーがいれば(おそらく彼らは今インターネットがなくても...)、信頼できるバックグラウンドサービスが必要です。あるいは、これはまったく不可能であると私に伝えようとしていますか?そうすれば、私が知っていることを教えようとせずに済むでしょう。 – tomseitz

+1

"30秒ごとに作業する必要はありません。" - 電話をかけたときに最新の情報を入手したい場合は、 "あるいは、あなたが私に言っていることは、これは明らかに可能ではないということですか?"あなたのアプリがフォアグラウンドにあり、積極的に使用されていない限り、これを確実に行うことはありません。マニュアルごとに – CommonsWare

答えて

0

私は、データの小さな部分をリフレッシュするためにジョブをセットアップするときに同じことに苦労しました。 jobFinished(JobParameters, boolean)を呼び出した後、この問題の解決策が同じIDでJobをもう一度設定している可能性があることがわかりました。私はそれがメインスレッドで毎回動作するはずだと思います。

セットアップ仕事への私の関数は次のようになります。

JobInfo generateRefreshTokenJobInfo(long periodTime){ 
    JobInfo.Builder jobBuilder = new JobInfo.Builder(1L, new ComponentName(mContext, JobService.class)); 
    jobBuilder.setMinimumLatency(periodTime); 
    jobBuilder.setOverrideDeadline((long)(periodTime * 1.05)); 
    jobBuilder.setRequiresDeviceIdle(false); 
    return jobBuilder.build(); 
} 

私は仕事の最初の呼び出しの後に私の仕事を終えるとき私は1つのより多くの時間これは私の仕事のスケジュールを変更します

jobFinished(mJobParameters, true); 
registerRefreshJob(5*60*1000L); 

メインスレッドで呼び出します同じidの同じ時間量でデバイスがアイドル状態にあるときは、あなたの仕事があなたが望むほど頻繁に開始されないように、あなたはまだドーズのウェイクロックの不足を考慮しなければなりません。デバイスは、システムがPowerManager.WakeLock、AlarmManagerアラーム、GPS、とのWi-Fiスキャンにドーズ制限の残りの部分を適用し、ドーズを入力した後一定時間静止している場合、それはhttps://developer.android.com/about/versions/nougat/android-7.0-changes.html

に記載されています。 Doze制限の一部または全部が適用されているかどうかに関わらず、システムは、アプリケーションがネットワークアクセスを許可され、遅延ジョブ/同期を実行できる短いメンテナンスウィンドウでデバイスを復帰させます。唯一setMinimumLatencyが使用されていることを確認します(あなたは15分以上の定期的なジョブ低く設定したい場合)

+3

しかし、ジョブスケジューラは1分でタイムアウトします。あなたのタスクが1分以上かかる場合、 'jobFinished'は実行されません。 'onStopJob'はタイムアウト後に呼び出されます。もし私があなただったら、 'onStopJob'の中にも登録します。 – Thupten

+0

1分の制限はアンドロイド5.1.1です – Thupten

0

誰かがまだ状況を克服しようとしている場合は、ここで

は> =アンドロイドNの回避策です。また、あなたが長い時間を要するタスクを実行している場合は、次のジョブをにスケジュールされ、現在のジョブの完了時間+ PROVIDED_TIME_INTERVAL

.SetPeriodic(長いミリ)は、AndroidのN

@Override 
public boolean onStartJob(final JobParameters jobParameters) { 
    Log.d(TAG,"Running service now.."); 
    //Small or Long Running task with callback 

    //Reschedule the Service before calling job finished 
    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
       scheduleRefresh(); 

    //Call Job Finished 
    jobFinished(jobParameters, false); 

    return true; 
} 

@Override 
public boolean onStopJob(JobParameters jobParameters) { 
    return false; 
} 

private void scheduleRefresh() { 
    JobScheduler mJobScheduler = (JobScheduler)getApplicationContext() 
        .getSystemService(JOB_SCHEDULER_SERVICE); 
    JobInfo.Builder mJobBuilder = 
    new JobInfo.Builder(YOUR_JOB_ID, 
        new ComponentName(getPackageName(), 
        GetSessionService.class.getName())); 

    /* For Android N and Upper Versions */ 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
     mJobBuilder 
       .setMinimumLatency(60*1000) //YOUR_TIME_INTERVAL 
       .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); 
    } 
以下のAPIレベルに適しています
0

定期的に15分以内にコードを実行したい場合は、手間のかかる方法を使用できます。このようにjobFinished()を設定してください

jobFinished(parameters, true); 

再試行戦略でコードを再スケジュールします。ビルダーに

.setBackoffCriteria(); 

を使用してカスタムバックオフ基準を定義します。その後、定期的に実行されます

関連する問題