آموزش JobScheduler در برنامه نویسی اندروید

سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش JobScheduler در برنامه نویسی اندروید می پردازیم JobScheduler چیست و چه استفاده دارد ؟ شاید با موقعیتی رو به رو شه باشید که بخواهید یک Task را بعدا با یکسری شرط انجام دهید JobScheduler به معنی زمان بندی کار است و اگر تعریف دقیقی از آن بخواهید می شود زمان بندی کار طبق شرایط خاصی البته این کار توسط Alarm Manager نیز امکان پذیر است در ادامه به بررسی ویژگی های این سرویس نیز خواهیم پرداخت با ما همراه باشید.
یکسری نکات را باید در استفاده از سرویس JobScheduler رعایت کنید.
اولین اینکه این سرویس از APi 21 به بعد یعنی اندروید 5 یا Lolipop قابل استفاده است.
پس باید minsdk را برابر با 21 قرار دهید.
JobScheduler در background اجرا می شود و در صورتی که یک شرط خاص اتفاق بیفتد اجرا می شود.
مزایای استفاده از JobScheduler

  • باتری گوشی اصلا مصرف نمی شود !
  • در background کارها انجام می شود.
  • ترد اصلی را استفاده نمی کند.

معایب آن

  • فقط تنها مشکل آن پشتیبانی از Api 21 به بعد است.

در ادامه به یک مثال خواهیم پرداخت با ما همراه باشید.
ابتدا در layout خود کد های زیر را قرار دهید.

<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 ایجاد کرده و کد های زیر را در آن قرار دهید.

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 ریجستر کنیم برای اینکار کد زیر را در آن قرار دهید.

<service android:name=".SchedulerService"
android:permission="android.permission.BIND_JOB_SERVICE" />

و در آخر هم کد مربوط به اکتیویتی اصلی ما همانند زیر می شود.

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 را لغو کردیمو
حتما برنامه را اجرا کنید تا متوجه عملکرد اصلی شوید.
 
این آموزش هم به پایان رسید.
 
موفق و موید باشید.

مطالعه بیشتر