Turkcell | Geleceği Yazanlar

GELECEĞİ YAZANLAR BLOG

Yeni Blog Yaz

Android Lollipop'ta JobScheduler API Kullanımı

Tuğba Üstündağ - 13 Temmuz 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/

5 Cevap

Doğukan

15 Temmuz 2015

Güzel...

Ömer AĞCA

20 Temmuz 2015

AlarmManager'den farkı nedir?

Tuğba Üstündağ

20 Temmuz 2015

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 Temmuz 2015

Cevap için teşekkürler.

serkan kul

20 Aralık 2019

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(
 

 

Yorum yapmak için Giriş Yapın ya da Üye olun.