2017-03-25 95 views
0

我正在學習如何使用JobScheduler。如onresume方法中所示,爲了執行作業,我設置了要滿足的條件,當設備未充電時,將安排作業,不管設備是否空閒,作業將每 7執行秒。如何使用Jobscheduler安排工作

在運行時,USB電纜連接到設備,以便安裝應用程序,這意味着設備正在充電,所以在安裝應用程序後 作業還沒有啓動,因爲設備正在充電,但我拔掉後,我執行的作業 執行的工作,但發生的事情是,工作從未開始,我不明白爲什麼

請讓我知道爲什麼這樣的行爲發生,請讓我知道下面的答案問題會幫助我更好地理解 jobScheduler:

問:是setRequiresChargi ng(false)表示只有在設備不充電的情況下才會執行該任務,或者意味着無論設備是否充電,任務都將被執行?

主要活動

public class MainActivity extends AppCompatActivity { 
private static final String TAG = MainActivity.class.getSimpleName(); 
private static int jobId = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.w(TAG, "onCreate"); 
    setContentView(R.layout.activity_main); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.w(TAG, "onResume"); 

    ComponentName serviceComponent = new ComponentName(this, MyJobService.class); 
    JobInfo.Builder builder = new JobInfo.Builder(jobId, serviceComponent); 

    builder.setRequiresCharging(false); 
    builder.setRequiresDeviceIdle(false); 
    builder.setPeriodic(7 * 1000); 

    JobScheduler jobScheduler = (JobScheduler) getApplication().getSystemService(Context.JOB_SCHEDULER_SERVICE); 
    jobScheduler.schedule(builder.build()); 
} 

}

jobService

package example.com.jobscheduler_00; 

public class MyJobService extends JobService { 
private static final String TAG = MyJobService.class.getSimpleName(); 

@Override 
public boolean onStartJob(JobParameters params) { 
    Log.w(TAG, "onStartJob JobId: " + params.getJobId()); 
    Toast.makeText(this, "onStartJob JobId:" + params.getJobId(), Toast.LENGTH_SHORT).show(); 

    jobFinished(params, false); 
    return true; 
} 

@Override 
public boolean onStopJob(JobParameters params) { 
    Log.w(TAG, "onStopJob"); 
    Toast.makeText(this, "onStopJob JobId:" + params.getJobId(), Toast.LENGTH_SHORT).show(); 

    return true; 
} 

}

+0

「並且該作業每7秒執行一次」 - Android 7.0+的最短時間爲15分鐘。我不記得Android 5.0-6.0的最低期限,但如果不到一分鐘,我會感到驚訝。 – CommonsWare

+0

謝謝先生..但正如你所說的「我不記得在Android 5.0-6.0的最短時間」..有沒有其他的選擇? – user2121

回答

0

我setRequiresCharging(false)意味着,只有在設備不充電的情況下才會執行該任務,或者意味着無論設備是否在充電,任務都將被執行?

documentation

指定運行此作業時,設備需要被插入此默認爲false。

換句話說,如果你希望你的工作只在條件下運行,當設備正在充電 - 你應該通過true。默認情況下,它是false,這意味着收費標準被忽略,即您的工作將被執行,無論設備是否收費或否(假設其他標準得到滿足)。

您可以檢查您的作業是否已成功啓動intJobScheduler.schedule(JobInfo job)返回。它將返回RESULT_SUCCESSRESULT_FAILURE

+1

但你會告訴我爲什麼拔掉USB電纜後,預定的作業不會馬上啓動? – user2121

+0

當它發現這是一個方便的時候,系統就會啓動你的工作。如果你想要精確,你必須使用AlarmManager。 – azizbekian