2017-10-16 90 views
1

我已經看過很多其他線程。然而,這似乎沒有任何幫助。如果應用程序被終止,Job Scheduler不起作用

我需要設置每天下午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:我想要一些任務在下午3點每天執行一次。

+0

您應該首先關注修復'JobService'。你不是調用'jobFinished()'(你需要做的),你不應該使用'AsyncTask'(使用普通線程或其他不涉及主應用程序線程的東西)。一般來說,一個寫得很好的'JobService'不應該受總覽屏幕的影響。但是,某些設備製造商擁有自己的任務管理器,這些管理器的行爲與「強制停止」的行爲類似(在「設置」中的應用頁面上按鈕),並會取消作業。您可以對這些設備做些什麼。 – CommonsWare

+0

另外,請記住,您不能在下午3點使用'JobScheduler'來執行某些操作,您的5秒輪詢時間段不適用於所有Android版本,並且使用'Toast'進行診斷並不是一個好主意(請使用LogCat)。 – CommonsWare

回答

0

我發現了這篇文章。這裏說它必須在asyncTask的onPostExecute方法中調用jobFinished()以讓系統知道該作業已完成。

jobFinished()需要兩個參數:當前的工作,所以它 知道哪些激活鎖定可被釋放,布爾值,指示是否 你想重新安排工作。如果你通過的話,這將踢 關閉JobScheduler的指數回退邏輯爲你

我希望它有幫助。

Scheduling jobs like a pro with JobScheduler