Bu yazıda Android 5.0 Lollipop sürümüyle gelen JobScheduler mimarisini inceleyeceğiz.
JobScheduler API’si, herhangi bir işi belirli zamanlar içerisinde yapılmasını istediğimizde kullanacağımız Android Lollipop ile gelen yeni birkaç Java sınıfıdır. JobScheduler aslında TimerTask sınıfının geliştirilmiş halidir. JobScheduler API’nin TimerTask’tan en büyük farkı, yapılmasını istediğiniz işin zaman çizelgesini hazırlayarak işin başlatma, durdurma ve sonlandırma süreçlerini belirleyebilir olmanızdır.
JobScheduler API’sinin içerdiği sınıflar ve işlevleri
JobScheduler API’si, “android.app.job” paketi içerisindeki bazı sınıfları kullanarak işlevselliğini sağlar. Paket içerisinde kullanılan sınıflar:
JobInfo sınıfı: İşle ilgili belli bilgileri elde etmek için kullanılır.
JobInfo.Builder sınıfı: JobInfo nesnelerini oluşturur ve yapmak istediğiniz işin özelliklerini belirler. Örneğin bu sınıf altında setPersisted methodu, boolean değer alır. Bu metoda true değer verirseniz telefonu kapatıp açtığınızda iş kaldığı yerden çalışmasını sürdürür.
JobParameters sınıfı: İşle ilgili birtakım parametreler sağlar.
JobScheduler sınıfı: Oluşturduğunuz işi başlatmayı, durdurmayı ve sonlandırmayı sağlar.
JobService sınıfı: JobScheduler ile ilgili geri dönüşleri Android servis mantığını kullanarak çalıştırır.
JobScheduler API’nin nasıl kullanılacağını örneklemek için bir uyarı mesajının periyodik bir şekilde gösterilmesini sağlayan projemizi inceleyelim.
MainActivity sınıfı
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 42 43 44 45 46 47 48 49 50 51 |
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.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 ); /*Bir iş zamanlamak için nesne oluşturduk.*/ mJobScheduler = (JobScheduler) getSystemService( Context.JOB_SCHEDULER_SERVICE ); //Arayüz elemanlarını tanımladık 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) { /*Burada da bir iş inşaa süreci yazdım. Birinci parametre ile iş ID belirtilir.Yani bu işin ID si "1" dir. ikinci parametrede de iş servisi (JobSchedulerService sınıfı) belirttim.Fakat buraya istediğiniz aktivite yi veya herhangi bir uygulamayı vs vs atayabilirsin. Mesela camere paket yolunu veya dila yolunu vs aklına gelen tüm işleri buraya atayabilirsin.*/ JobInfo.Builder builder = new JobInfo.Builder( 1, new ComponentName( getPackageName(), JobSchedulerService.class.getName() ) ); //"setPeriodic" metodu ile çalışma periyodu süresini belirttim builder.setPeriodic( 3000 ); if( mJobScheduler.schedule( builder.build() ) <= 0 ) { //İnşaa edilmiş işlerle ilgili bir şeyler ters giderse burada uyarı mesajı vb. kodlar kullanabilirsiniz } } }); //İşlemi durduma butonun tıklanma metodu.. mCancelAllJobsButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick( View v ) { /* burda da tüm işler iptal ettim. Dilerseniz tek tek de işleri iptal edebilirsiniz.*/ mJobScheduler.cancelAll(); } }); } } |
JobSchedulerService sınıfı
Şimdi de JobSchedulerService sınıfının nasıl kullanıldığını inceleyelim:
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 |
import android.app.job.JobParameters; import android.app.job.JobService; import android.os.Handler; import android.os.Message; import android.widget.Toast; public class JobSchedulerService extends JobService { //Mesajı mJobHandler olarak tanımladığımız Handler sınıfında tuttuk private Handler mJobHandler = new Handler( new Handler.Callback() { @Override public boolean handleMessage( Message msg ) { //Mesajı uyarı seklinde arayuzde gösterdik.. Toast.makeText( getApplicationContext(), "JobService task running", Toast.LENGTH_SHORT ).show(); jobFinished( (JobParameters) msg.obj, false ); return true; } } ); //İşin işlevseliğininn başlatıldığı event @Override public boolean onStartJob(JobParameters params ) { // Handler sınıfında tuttugumuz mesajı yani işi gondererek işi baslattık mJobHandler.sendMessage( Message.obtain( mJobHandler, 1, params ) ); return true; } //İşin işlevselliğini durduran event @Override public boolean onStopJob( JobParameters params ) { //Handler sınıfından , Mesajı silerek işi durdurduk //Aldıgı parametre ilgili iş sürecinin ID'si dir. mJobHandler.removeMessages( 1 ); return false; } } |
Son olarak; AndroidManifest.xml dosyamızda JobSchedulerService adlı servisimizi tanımlamak icin, “service tag” bölümünü ekledik.
1 2 3 |
<!--?xml version="1.0" encoding="utf-8"?--> <!-- JobSchedulerService adlı servisimizi tanımladık--> |
Sonuç
Bakalım yazdığımız bu sınıflar çalışıyor mu? 🙂
Kaynaklar: