私はこれに関して他の多くのスレッドを見てきました。しかし、これはどれも役に立つとは思わない。アプリケーションが終了するとジョブスケジューラが動作しない
毎日午後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で実行するタスクが必要です。
あなたは 'JobService'の修正に最初に焦点を当てるべきです。あなたは 'jobFinished()'を呼び出すのではなく、 'AsyncTask'を使ってはいけません。(普通のスレッドか、メインのアプリケーションスレッドに関係しないものを使用してください)。一般的には、よく書かれた 'JobService'はオーバービュー画面の影響を受けてはいけません。ただし、デバイスメーカーの中には、強制停止([設定]のアプリケーションページのボタン)のように動作する独自のタスクマネージャがあり、ジョブをキャンセルします。あなたはこれらのデバイスについてできることはほとんどありません。 – CommonsWare
また、午後3時に 'JobScheduler'を使って何かを行うことはできません。あなたの5秒間のポーリング期間はすべてのAndroidバージョンでは動作しません。また、診断のために' Toast'を使うのは良い考えではありませんLogCatを使用してください)。 – CommonsWare