Android

Android Lollipop'ta JobScheduler API Kullanımı

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&#...

Tuğba Üstündağ |

13.07.2015

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ı

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:

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.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tugbaust.jobscheduler_example" >
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- JobSchedulerService adlı servisimizi tanımladık-->
        <service android:name=".JobSchedulerService"
            android:permission="android.permission.BIND_JOB_SERVICE" />
    </application>
</manifest>

 

Sonuç

Bakalım yazdığımız bu sınıflar çalışıyor mu? :)

 

 

Kaynaklar:

  1. https://developer.android.com/reference/android/app/job/package-summary.html
  2. http://www.edumobile.org/android/android-lollipop-jobscheduler-api/

Tuğba Üstündağ |

13.07.2015

Yorumlar

serkan kul
20.12.2019 - 04:02

uygulama açıldığında splash reklamın tekrarlanması için ne yapmam lazım


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate( savedInstanceState );

StartAppSDK.init( this, "210854335", true );

StartAppAd.setAutoInterstitialPreferences(
 

 

Doğukan
15.07.2015 - 11:53

Güzel...

Ömer AĞCA
20.07.2015 - 09:52

AlarmManager'den farkı nedir?

Tuğba Üstündağ
20.07.2015 - 01:27

Alarm manager, belirlenen zamanlarda yapılmak istenen işlerin  çalışmasını sağlar.

Job scheduler ise zaman aralığı verip birden fazla işi istediğin zaman aralıklarında planlayıp işin çalışmasını saglar.

Yani birinde sadece alarm kurar gibi şu saat iş olsun diyorsun diğerinde ise işin yapılma zamanını planlıyorsun. 

 

Ömer AĞCA
20.07.2015 - 03:26

Cevap için teşekkürler.