2017-10-16 19 views
1

私はこれに関して他の多くのスレッドを見てきました。しかし、これはどれも役に立つとは思わない。アプリケーションが終了するとジョブスケジューラが動作しない

毎日午後3時に実行されるジョブスケジューラを設定する必要があります。

は、ここに私のサービスクラスです:

public class AttendanceCheckScheduler extends JobService { 
    private AttendanceCheckTask mAttendanceCheckTask; 

    private static final String TAG = "AttendanceCheckScheduler"; 

    @Override 
    public boolean onStartJob(JobParameters params) { 

     mAttendanceCheckTask = new AttendanceCheckTask(); 
     mAttendanceCheckTask.execute(); 
     jobFinished(params, false); 
     return true; 
    } 

    @Override 
    public boolean onStopJob(JobParameters params) { 

     mAttendanceCheckTask.cancel(true); 
     return false; 
    } 

    private class AttendanceCheckTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      // some long running task... 
      Toast.makeText(getApplicationContext(), "Task run", Toast.LENGTH_SHORT).show(); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void s) { 
      super.onPostExecute(s); 
     } 
    } 
} 

そして、これは私がActivityHomeでジョブをスケジュールしています方法です。

public class ActivityHome extends AppCompatActivity { 

    private static final int JOB_ID = 100; 
    private JobScheduler jobScheduler; 
    protected JobInfo jobInfo; 

    private static final String TAG = "ActivityHome"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 

     // other irrelevant codes here... 

     ComponentName componentName = new ComponentName(this, AttendanceCheckScheduler.class); 
     JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, componentName); 

     builder.setPeriodic(5000); // every 5 seconds for testing purpose... 
     builder.setPersisted(true); 

     jobInfo = builder.build(); 

     jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE); 
     jobScheduler.schedule(jobInfo); 

     Toast.makeText(this, "job scheduled", Toast.LENGTH_LONG).show(); 
    } 
} 

何もかも正常に動作するようですし、以上のように、私はトーストメッセージTask run 5秒ごとに受け付けております。

しかし、アプリが殺されると(マルチタスクウィンドウですべてのタスクをクリアすることによって)、私はトーストメッセージの受信を停止します。

アプリが強制終了されてもアプリを実行し続けるにはどうすればよいですか?

P.S:毎日3回、3PMで実行するタスクが必要です。

+0

あなたは 'JobService'の修正に最初に焦点を当てるべきです。あなたは 'jobFinished()'を呼び出すのではなく、 'AsyncTask'を使ってはいけません。(普通のスレッドか、メインのアプリケーションスレッドに関係しないものを使用してください)。一般的には、よく書かれた 'JobService'はオーバービュー画面の影響を受けてはいけません。ただし、デバイスメーカーの中には、強制停止([設定]のアプリケーションページのボタン)のように動作する独自のタスクマネージャがあり、ジョブをキャンセルします。あなたはこれらのデバイスについてできることはほとんどありません。 – CommonsWare

+0

また、午後3時に 'JobScheduler'を使って何かを行うことはできません。あなたの5秒間のポーリング期間はすべてのAndroidバージョンでは動作しません。また、診断のために' Toast'を使うのは良い考えではありませんLogCatを使用してください)。 – CommonsWare

答えて

0

この記事が見つかりました。ここでは、asyncTaskのonPostExecuteメソッドでjobFinished()を呼び出して、ジョブが完了したことをシステムに知らせる必要があることを示しています。それは を解放することができwakelock知っている、とあなたは仕事のスケジュールを変更したい かどうかを示すブールように、現在の仕事:

jobFinished()は2つのパラメータが必要です。あなたが合格すると、 はJobSchedulerの指数バックオフロジックをオフにします

私はそれが役に立ちそうです。

Scheduling jobs like a pro with JobScheduler

関連する問題