آموزش JobScheduler در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش JobScheduler در برنامه نویسی اندروید می پردازیم JobScheduler چیست و چه استفاده دارد ؟ شاید با موقعیتی رو به رو شه باشید که بخواهید یک Task را بعدا با یکسری شرط انجام دهید JobScheduler به معنی زمان بندی کار است و اگر تعریف دقیقی از آن بخواهید می شود زمان بندی کار طبق شرایط خاصی البته این کار توسط Alarm Manager نیز امکان پذیر است در ادامه به بررسی ویژگی های این سرویس نیز خواهیم پرداخت با ما همراه باشید.
یکسری نکات را باید در استفاده از سرویس JobScheduler رعایت کنید.
اولین اینکه این سرویس از APi 21 به بعد یعنی اندروید 5 یا Lolipop قابل استفاده است.
پس باید minsdk را برابر با 21 قرار دهید.
JobScheduler در background اجرا می شود و در صورتی که یک شرط خاص اتفاق بیفتد اجرا می شود.
مزایای استفاده از JobScheduler
- باتری گوشی اصلا مصرف نمی شود !
- در background کارها انجام می شود.
- ترد اصلی را استفاده نمی کند.
معایب آن
- فقط تنها مشکل آن پشتیبانی از Api 21 به بعد است.
در ادامه به یک مثال خواهیم پرداخت با ما همراه باشید.
ابتدا در layout خود کد های زیر را قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/schedule_job" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Schedule Job"/> <Button android:id="@+id/cancel_all" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cancel All"/> </LinearLayout> |
در بالا دو دکمه تعریف شده است اولی برای شروع job و دومی برای لغو کردن job.
یک کلاس به نام SchedulerService.java ایجاد کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package ir.programchi; import android.app.job.JobParameters; import android.app.job.JobService; import android.os.Handler; import android.os.Message; import android.widget.Toast; public class SchedulerService extends JobService { private Handler mJobHandler = new Handler( new Handler.Callback() { @Override public boolean handleMessage( Message msg ) { Toast.makeText( getApplicationContext(), "JobService task running", Toast.LENGTH_SHORT ).show(); jobFinished( (JobParameters) msg.obj, false ); return true; } } ); @Override public boolean onStartJob(JobParameters params ) { mJobHandler.sendMessage( Message.obtain( mJobHandler, 1, params ) ); return true; } @Override public boolean onStopJob( JobParameters params ) { mJobHandler.removeMessages( 1 ); return false; } } |
در ابتدا باید از کلاس خودمان از SchedulerService یا کلاسمون Extend از JobService بگیریم هر job یک شروع و پایان دارد شروع و پایان آنها توسط به onStartJob و onStopJob انجام می شود.
حالا زمان آن است که این سرویس را در AndroidManifest.xml ریجستر کنیم برای اینکار کد زیر را در آن قرار دهید.
1 2 | <service android:name=".SchedulerService" android:permission="android.permission.BIND_JOB_SERVICE" /> |
و در آخر هم کد مربوط به اکتیویتی اصلی ما همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package com.example.jobscheduler; import android.app.Activity; import android.app.job.JobInfo; import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private JobScheduler mJobScheduler; private Button mScheduleJobButton; private Button mCancelAllJobsButton; @Override protected void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_main ); mJobScheduler = (JobScheduler) getSystemService( Context.JOB_SCHEDULER_SERVICE ); mScheduleJobButton = (Button) findViewById( R.id.schedule_job ); mCancelAllJobsButton = (Button) findViewById( R.id.cancel_all ); mScheduleJobButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { JobInfo.Builder builder = new JobInfo.Builder( 1, new ComponentName( getPackageName(), SchedulerService.class.getName() ) ); builder.setPeriodic( 3000 ); if( mJobScheduler.schedule( builder.build() ) <= 0 ) { //If something goes wrong } } }); mCancelAllJobsButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick( View v ) { mJobScheduler.cancelAll(); } }); } } |
در بالا ابتدا یم instance از JobScheduler گرفتم سپس در رویداد مربوط به هر کلیک کدی برای اجرا در یک دوره زمانی (3ثانیه ) یکبار تعریف کردیم و در رویداد کلیک لغو هم JobScheduler را لغو کردیمو
حتما برنامه را اجرا کنید تا متوجه عملکرد اصلی شوید.
این آموزش هم به پایان رسید.
موفق و موید باشید.
سلام . ببخشید تایم رو کدوم قسمت باید تعیین کرد . و یه سوال دیگه این که میشه به برنامه ساعت به خصوصی گفت ؟ مثلا ساعت 15:00 . یا اینکه حتما باید یه زمان به خصوص بعد از اجرا داده بشه؟
سلام بله امکان پذیر است شما در سایت واژه alarm manger رو جستجو کنید.
باسلام و تشکر از سایت مفیدتون
برای ساخت اپلیکیشن زمانبندی انجام کارها وقتی مثلا کاربر هنگام ثبت٬ کار مورد نظر را مثلا یک روز درمیان و هر روز به تعداد دو مرتبه در روز انتخاب میکند ٬ دیتابیس و استخراج داده از دیتابیس و نمایش برای کاربر چگونه است؟
متشکرم
خب شما باید ببینید کاربر می خواد این کار چند روز تکرار بشه یک فیلد می گیرید که تعداد رو در آن بریزید و همین چیزی که گفتید برای مثال یک روز در میان می شود 3 پس شما باید سه بار Alram Manager رو مقداری بدید یعنی این مقادیر در دیتابیسه که حالا بعد از select در آن قرار می گیرد و باید یک فیلد داشته باشید که این هر روز دو مرتبه یا n مرتبه رو داشته باشه .
موفق باشید.
سلام
در اندروید 8 برای استفاده از JobService کمترین زمان تکرار 15 دقیقه هست، یعنی 15*60*1000 در غیر اینصورت برنامه عمل نمیکنه.
چه راهکاری هست که بتونم زمان تکرار را بر روی 2 دقیقه تنظیم کنم.
از آلارم منجر هم استفاده میکنم بعد از چند بار تکرار برنامه متوقف میشه.
سلام مرسی از سایت خوبیتون ،،،یه سوال دارم ممنون میشم به واضیح وساده جواب بدین ،،،من یه کد دارم برا اینکه عکس با دوربین گوشی گرفته شد یه پیام نشون بده و از برودکست ریسیور استفاده کردم این مد تا اندر وید 6خوب جواب میده ولی از اندروید 6 بالا تر جواب نمیده به دلیل دریافت نکردن برود کست ،،،حالا میشه این کد تو کلاس scheduled استفاده کرد که رو اندروید 6 بالا تر ام جواب بده مرسی