Android Alarm Manager Kullanımı

Merhaba Arkadaşlar ,
Mobilhanem.com sitemizden anlattığımız/yayınladığımız derslerimize bu dersimizde, Android Alarm Manager kullanımı dersi ile devam ediyoruz.

Alarm Manager , android cihazlar da alarm servisine erişebilmemiz için oluşturulan bir sınıftır. Örneğin uygulama içinde alarmımız ayarlanır ve uygulama kapatılır. Belirtilen alarm aralığına göre uygulamamız kapalı olsa bile alarm çalışır bu android de arkan planda çalışan servisler tarafından gerçekleşir.

Bu servisler sayesinde kullanıcıya hem kullanıcıya uyarı verilebilir hemde istenen alarm olayı tetiklenir. Aslında uyarılar için iki temel saat tipi vardır. Android Alarm Manager Kullanımını çeşitli zaman tiplerine göre gruplandırabiliriz ; geçirilen zamana göre uyarı almak istiyorsanız ( elapsed real time ) kullanılır.    ( örnek verecek olursak; her yarım saat de bir alarm olayının tetiklenmesi ), gerçek zamana göre uyarı almak istiyorsanız ( real time clock ) kullanılır. ( örnek verecek olursak; saat öğlen saat 4 de alarmın tetiklenmesi vb. ) Her iki türde de telefon ekranı kapalı dahi olsa cihazı uyandırmak mümkündür.

  • RTC_WAKEUP : Belli bir zamanda, sıra bekleyen Intent’i çalıştırmak için cihazı uyandırır.

( Aşağıdaki kod a baktığımızda öğlen saat 4 de alarm  çalacak şekilde alarm kurulur. ( not: alarm günde bir kere belirtilen saat de çalışır. )

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 16);

alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, alarmIntent);
  • RTC : Belli bir zamanda, sıra bekleyen Intent’i çalıştırır fakat cihaz uyku modunda ise cihazı uyandırmaz.
  • ELAPSED_REALTIME_WAKEUP : Geçen zamana göre Intent’i çalıştırmak için cihazı uyandırır.

( Aşağıdaki koda baktığımızda 30 dakika içinde alarm devreye girer ve her 30 dakika da setInexactRepeating komutu sayesinde yeniden tetiklenir. )

alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        AlarmManager.INTERVAL_HALF_HOUR,
        AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);
  • ELAPSED_REALTIME : Geçen zamana göre Intent’i çalıştırır fakat cihaz uyku modunda ise cihazı uyandırmaz.

Şimdi RTC_WAKEUP türüne göre küçük bir örnek yapmaya başlayalım; öncelikle android projemizde uyarı yayınını alabilmemiz için BroadcastReceiver kullanıyoruz. Aşağıdaki sınıfımıza baktığımızda alarm tetiklendiğinde onReceive methodunda kullanıcıya Toast mesajını gösteriyoruz ve cihazda default olarak seçili olan alarm müziği ne ise onu çalıyoruz.

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "Alarm Çalıyor! Artık Uyan!", Toast.LENGTH_LONG).show();

        Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        if (alarmUri == null)
        {
            alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        }
        Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
        ringtone.play();
    }
}

MainActivity sınıfımız ise aşağıdadır. Kaynak kodları indirip çalıştırdığınızda açılan sayfada butona tıklıyoruz ve karşımızda pop up içinde saat dilimi çıkıyor ve alarmın saat kaçta çalmasını gerektiğini belirliyoruz.

MainActivity.java

public class MainActivity extends Activity {

    private Button startAlarmBtn;
    private TimePickerDialog timePickerDialog;
    final static int REQUEST_CODE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        startAlarmBtn = (Button)findViewById(R.id.startAlarmBtn);

        startAlarmBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                
                openPickerDialog(false);
            }
        });

    }

    private void openPickerDialog(boolean is24hour) {

        Calendar calendar = Calendar.getInstance();

        timePickerDialog = new TimePickerDialog(
                MainActivity.this,
                onTimeSetListener,
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                is24hour);
        timePickerDialog.setTitle("Alarm Ayarla");

        timePickerDialog.show();
    }

    TimePickerDialog.OnTimeSetListener onTimeSetListener
            = new TimePickerDialog.OnTimeSetListener(){

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

            Calendar calNow = Calendar.getInstance();
            Calendar calSet = (Calendar) calNow.clone();

            calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
            calSet.set(Calendar.MINUTE, minute);
            calSet.set(Calendar.SECOND, 0);
            calSet.set(Calendar.MILLISECOND, 0);

            if(calSet.compareTo(calNow) <= 0){

                calSet.add(Calendar.DATE, 1);
            }

            setAlarm(calSet);
        }};

    private void setAlarm(Calendar alarmCalender){


        Toast.makeText(getApplicationContext(),"Alarm Ayarlandı!",Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), REQUEST_CODE, intent, 0);
        AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalender.getTimeInMillis(), pendingIntent);

    }
}

Son olarak AndroidManifest.xml dosyamızda yukarıda oluşturduğumuz receiver sınıfını tanımlıyoruz.         ( not: bu tanımlamayı yapmazsanız BroadcastReceiver hiç bir zaman devreye girmeyecektir ve alarm olayı tetiklenmeyecektir. )

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mobilhanem.alarmmanagerexample">

    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@drawable/mobilhanem_logo"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".AlarmReceiver" />
    </application>

</manifest>

 

İşte Android AlarmManager Kullanımı bu kadar kolay , temel olarak önemli noktalara değinmeye çalıştım umarım faydalı olur herkese.

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

Mobilhanem.com üzerinden anlattığımız mobil uygulama geliştirme derslerine devam edeceğiz. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitemizden de sorabilirsiniz.

Bir dahaki dersimizde görüşmek dileğiyle..

3

Alper Beyler

Yüksek Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği
Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği (4/3.30) (2010-2014)
Lisans : Viyana Teknik Üniversitesi / Bilgisayar Bilimleri (2013)

14 Yorum

  • Hocam 2 buton 2 textview’im var.. butonlara basarak 2 farklı timer’ı çalıştıramıyorum. Buton1 basıyorum timer1 çalışıyor ve textview1de saniye saymaya başlıyor. fakat buton2ye basınca 2.timeri çalıştırmak istediğimde olmuyor.
    2.textview’e timer o an kaçtaysa oradan başlıyor saymaya oysa hangi butona ne zaman basarsam sıfırdan başlaması gerekiyor timer’ların ama olmuyor.
    2 adet timer’ı nasıl yöneteceğimi öğretirmisiniz.

  • RTC_WAKEUP metodu ile kullandığımızda telefon kapanıp açılsa dahi onReceive metodu çalışır mı?

    • Bunun bu konuyla alakası yok. Büyük ihtimal Gradle’n güncellenmiş. Bu proje eski kalıyor. build.gradle dosyasında minSdk versiyonunu en az 25.0.2 yapmalısın.

      • yenı bir proje bulmam lazım örnek olarak..Var mı acaba bu konuyla da alakası ornek proje üzerinden yapacağım için

  • Abi ben yılın her günü farklı bir şey yapan bir uygulama yapmak istiyorum ama bu uygulamayı alarm olarak değilde (if else ) ile yapmak istiyorum yani mesela şöyle bir kod yazmak istiyorum eğer bugü ay eylül ise ve gün 23 ise falanca olay gerçekleşsin.bunun için önce ay ve günü bir textview üzerinde gösteriyorum diyelim ki textbiew de (Ağu/24 ) yazdı daha sonra denemek için (if else ) ile diyorum ki eğer textview de (Ağu/24) yazmışsa ikinci textviewde tamam yazılsın eğer böyle değilse tamam değil yazılsın ama textview de (Ağu/24) yazmasına rağmen her seferinde ikinci textview de tamam değil yazıyor

  • Merhaba,

    Alarmı sonlandırma işlemini ya da alarm süresini kısaltma işlemini nasıl yapabilirim?

  • Hocam bu alarm gün içerisindeki saatler için geçerli ….spesifik günler için alarmı nasıl yapabiliriz?

  • hocam ben şimdi anlamadım . Gayet iyi anlatmışsınız ama 30 dk java kısmına nasıl yazacağımızı anlamadım . ıntent olarak tanıtmamı isityor ve ben bunu yapamdım bilen varsa hocalarımın arasından söylerseler sevinirim

  • Merhaba bilgi için teşekkürler. Bu programı geliştirerek şunu yapabilir miyiz.
    Bu programı alarm olarak kullanırken alarm zamanı geldiğinde bir ses çalmak yerine bir uygulamayı tetiklemek için kullanıp, uygulama çalışıp sonlandığında cihazı uykuya alabilirmiyiz.
    Buna neden gerek oluyor derseniz, Bir çok kişi App inventor olarak programını kolaylıkla yapıyor. App inventor programı arka planda çalışmıyor. Alarm geldiğinde verilen program ismine göre ekran program çağırılıp kontrol edilecek ve sonrasında tekrar uykuya dalacak. Bu program bir arabirim gibi çalışacak. Bu mümkün mü. Ya da bu mantıkla arka planda çalışamayan uygulamaları çalıştırıp kapatacak bir program yazılabilir mi. Bu sorun belki de milyonlarca amatör app inventor uygulaması yapan kişinin ortak çözümü olacaktır. Tabii ki ekranı açmasına gerek yok uykudan uyanıp ekranı açmadan program kontrol edilir. Ekranın açılması gerekmiyorsa bunu kullanıcı belirtebilir.
    Mesela app inventor da clock bloğu var. program ekrandan kaybolsa bile çalışmaya devam ediyor. Fakat cihaz uykuya geçtiğinde duruyor. Bu nedenle uyku durumunda kontrolleri yapamıyor.
    Cevabınız için teşekkürler.
    Kolay gelsin.

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?