Android 5.0中使用JobScheduler 排程作業
阿新 • • 發佈:2019-01-29
原理請看這邊文章:http://blog.csdn.net/cuiran/article/details/42805057
本篇文章抄襲了這個作者的部分程式碼:http://blog.csdn.net/zhangyongfeiyong/article/details/51495791
在進行Android開發時,會遇到這樣的情況:想在將來的某個時間或在一定條件下執行任務,如上傳圖片、下載歌曲等操作想在接入電源或連線到WIFI時執行。Android L提供了JobScheduler API。
當一組預定義的條件得到滿足時,JobScheduler API的應用程式執行一項操作。不像AlarmManager類,JobScheduler的時間測定是不準確的。此外,該API能夠一同批處理各種工作。
JobService:
public class MyJobService extends JobService { private static final String TAG = "MyJobService"; /** * false: 該系統假設任何任務執行不需要很長時間並且到方法返回時已經完成。 * true: 該系統假設任務是需要一些時間並且當任務完成時需要呼叫jobFinished()告知系統。 */ @Override public boolean onStartJob(JobParameters params) { Log.i(TAG, "Totally and completely working on job " + params.getJobId()); if (isNetworkConnected()) { new SimpleDownloadTask().execute(params); return true; } else { Log.i(TAG, "No connection on job " + params.getJobId() + "; sad face"); } return false; } /** * 當收到取消請求時,該方法是系統用來取消掛起的任務的。 * 如果onStartJob()返回false,則系統會假設沒有當前執行的任務,故不會呼叫該方法。 */ @Override public boolean onStopJob(JobParameters params) { Log.i(TAG, "stop job " + params.getJobId()); return false; } private boolean isNetworkConnected() { ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = manager.getActiveNetworkInfo(); return (info != null && info.isConnected()); } private class SimpleDownloadTask extends AsyncTask<JobParameters, Void, String> { private JobParameters mJobParam; @Override protected String doInBackground(JobParameters... params) { mJobParam = params[0]; try { InputStream is = null; int len = 50; URL url = new URL("http://www.baidu.com"); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.setRequestMethod("GET"); conn.connect(); int responseCode = conn.getResponseCode(); Log.i(TAG, "response code is : " + responseCode); is = conn.getInputStream(); Reader reader = null; reader = new InputStreamReader(is, "UTF-8"); char[] buffer = new char[len]; reader.read(buffer); return new String(buffer); } catch (Exception e) { return "unable to retrieve web page"; } } @Override protected void onPostExecute(String result) { jobFinished(mJobParam, false); Log.i(TAG, "獲取結果:" + result); } } }
呼叫:
public class MainActivity extends Activity { private TextView result; private ComponentName jobService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); jobService = new ComponentName(this, MyJobService.class); Intent service = new Intent(this, MyJobService.class); startService(service); result = (TextView) findViewById(R.id.result_tv); Button btn = (Button) findViewById(R.id.button); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { pollServer(); } }); } private void pollServer() { JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); int jobId; for (int i = 0; i < 10; i++) { jobId = i; JobInfo jobInfo = new JobInfo.Builder(jobId, jobService) .setMinimumLatency(5000)// 設定任務執行最少延遲時間 .setOverrideDeadline(60000)// 設定deadline,若到期還沒有達到規定的條件則會開始執行 .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)// 設定網路條件 .setRequiresCharging(true)// 設定是否充電的條件 .setRequiresDeviceIdle(false)// 設定手機是否空閒的條件 .build(); result.append("scheduling job " + i + "!\n"); scheduler.schedule(jobInfo); } } }
需要在AndroidMainfest.xml中註冊service
<service
android:name=".MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE" >
</service>