Android: AlarmManager nasıl kullanılır


90

Ayarlandıktan 20 dakika sonra bir kod bloğu tetiklemem gerekiyor AlarmManager.

Biri bana AlarmManagerAndroid'de nasıl kullanılacağına dair örnek kod gösterebilir mi?

Birkaç gündür bazı kodlarla oynuyorum ve işe yaramayacak.

Yanıtlar:


110

"Bazı örnek kodlar" söz konusu olduğunda o kadar kolay değildir AlarmManager.

İşte kurulumunu gösteren bir pasaj AlarmManager:

AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);

mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);

Bu örnekte kullanıyorum setRepeating(). Tek seferlik bir alarm istiyorsanız, sadece kullanırsınız set(). İlk parametrede kullandığınız zaman bazında alarmın başlaması için zaman verdiğinizden emin olun set(). Yukarıdaki örneğimde kullanıyorum AlarmManager.ELAPSED_REALTIME_WAKEUP, bu yüzden zaman tabanım SystemClock.elapsedRealtime().

İşte bu tekniği gösteren daha büyük bir örnek proje .


2
Tekrar merhaba. Yanıt için teşekkürler. Kitabınızı satın alırsam, bir alarm yöneticisinin nasıl uygulanacağını tüm ayrıntılarıyla açıklıyor mu?
Tom

7
Advanced Android kitabı (Sürüm 0.9) AlarmManager, WakeLocks ve bu örneğin geri kalanını kapsayan ~ 9 sayfaya sahiptir. Yukarıdaki cevabımda bahsettiğim düzeltmeyi yaptığım için muhtemelen 1.0 Sürümünde biraz genişleyecektir. Kitapla veya örnek koduyla ilgili sorularınız varsa, groups.google.com/group/cw-android adresine gidin ve onları yanıtlamaktan memnuniyet duyarım .
CommonsWare

17
Herhangi bir android geliştiricisinin Mark'ın kitaplarına abone olması gerekir :) En az bir kez
Bostone

1
@ MarioGalván: Uygulamanız ilk kez çalıştırıldığında ve yeniden başlatıldığında bunu ayarlamanız gerekir.
CommonsWare

Bence AlarmManager.RTC_WAKEUP'ı hemen ve ardından her PERIOD ateşlemesini istiyorsanız kullanmalısınız. Kodunuzda, SystemClock.elapsedRealtime () ve ardından her PERIOD sonrasında etkinleşir.
Damon Yuan

66

Android örnek kodunda bazı iyi örnekler var

. \ android-sdk \ samples \ android-10 \ ApiDemos \ src \ com \ example \ android \ apis \ app

Kontrol edilecekler:

  • AlarmController.java
  • OneShotAlarm.java

Öncelikle, bir alıcıya ihtiyacınız var, alarmınız tetiklendiğinde onu dinleyebilecek bir şey. Aşağıdakileri AndroidManifest.xml dosyanıza ekleyin

<receiver android:name=".MyAlarmReceiver" />

Ardından aşağıdaki sınıfı oluşturun

public class MyAlarmReceiver extends BroadcastReceiver { 
     @Override
     public void onReceive(Context context, Intent intent) {
         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}

Ardından, bir alarmı tetiklemek için aşağıdakileri kullanın (örneğin ana faaliyetinizde):

AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
Calendar time = Calendar.getInstance();
time.setTimeInMillis(System.currentTimeMillis());
time.add(Calendar.SECOND, 30);
alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);

.


Ya da daha iyisi, her şeyi halleden bir sınıf hazırlayın ve bu şekilde kullanın

Bundle bundle = new Bundle();
// add extras here..
MyAlarm alarm = new MyAlarm(this, bundle, 30);

bu şekilde, hepsine tek bir yerde sahip olursunuz (düzenlemeyi unutmayın AndroidManifest.xml)

public class MyAlarm extends BroadcastReceiver {
    private final String REMINDER_BUNDLE = "MyReminderBundle"; 

    // this constructor is called by the alarm manager.
    public MyAlarm(){ }

    // you can use this constructor to create the alarm. 
    //  Just pass in the main activity as the context, 
    //  any extras you'd like to get later when triggered 
    //  and the timeout
     public MyAlarm(Context context, Bundle extras, int timeoutInSeconds){
         AlarmManager alarmMgr = 
             (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent intent = new Intent(context, MyAlarm.class);
         intent.putExtra(REMINDER_BUNDLE, extras);
         PendingIntent pendingIntent =
             PendingIntent.getBroadcast(context, 0, intent, 
             PendingIntent.FLAG_UPDATE_CURRENT);
         Calendar time = Calendar.getInstance();
         time.setTimeInMillis(System.currentTimeMillis());
         time.add(Calendar.SECOND, timeoutInSeconds);
         alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
                      pendingIntent);
     }

      @Override
     public void onReceive(Context context, Intent intent) {
         // here you can get the extras you passed in when creating the alarm
         //intent.getBundleExtra(REMINDER_BUNDLE));

         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}

2
Merhaba! Bu kodu test ettim ve kötüleşti (+1). ama bunu çoklu alarmlar için denedim (biri 10 saniye, diğeri 15 saniye ve sadece ikinci alarm ateşlendi. Bir şeyi yanlış mı yapıyorum, yoksa sorun mu kralı? DÜZENLEME: Tamam, sorunu burada buldum : stackoverflow.com/questions/2844274/…
Nuno Gonçalves

FWIW, bunun için bir kurucu yerine statik bir yöntem kullanırdım.
Edward Falk

9

Yapmanız gereken, önce planlamanız gereken amacı oluşturmaktır. Sonra bu niyetin pendingIntent'ini edinin. Aktiviteleri, hizmetleri ve yayınları planlayabilirsiniz. Bir aktivite planlamak için, örneğin MyActivity:

  Intent i = new Intent(getApplicationContext(), MyActivity.class);
  PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),3333,i,
  PendingIntent.FLAG_CANCEL_CURRENT);

Bu pendingIntent'i alarmManager'a verin:

  //getting current time and add 5 seconds in it
  Calendar cal = Calendar.getInstance();
  cal.add(Calendar.SECOND, 5);
  //registering our pending intent with alarmmanager
  AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);

Şimdi MyActivity , uygulamanızı durdurursanız veya cihazınız uyku durumuna geçerse (RTC_WAKEUP seçeneği nedeniyle) , uygulamanın başlatılmasından 5 saniye sonra başlatılacaktır . Örnek kodun tamamını okuyabilirsiniz Etkinliklerin, hizmetlerin ve yayınların planlanması #Android


+1 harika cevap, tam olarak ihtiyacım olan şey, çalışan bir 'set' örneği.
A.Alqadomi

4

Yorum yapmak istedim ama <50 rep, işte burada. 5.1 veya üzeri sürümde çalıştırıyorsanız ve bir dakikadan kısa bir aralık kullanırsanız, bunun gerçekleşeceğini hatırlatmak isteriz:

Suspiciously short interval 5000 millis; expanding to 60 seconds

Buraya bakın .


3

Alarmmanager'dan bir servisi aramak istediğinizde bazı örnek kodlar:

PendingIntent pi;
AlarmManager mgr;
mgr = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(DataCollectionActivity.this, HUJIDataCollectionService.class);    
pi = PendingIntent.getService(DataCollectionActivity.this, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , 1000, pi);

Kullanıcı izinlerini sormanıza gerek yok.


Çok yaygın bir kısaltma.
Phantômaxx

0

AlarmManager, belirli bir zamanda bazı kodları tetiklemek için kullanılır.

Bir Alarm Yöneticisini başlatmak için önce örneği Sistemden almanız gerekir. Ardından, belirttiğiniz ileride yürütülecek olan PendingIntent'i iletin

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Intent alarmIntent = new Intent(context, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
int interval = 8000; //repeat interval
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);

Alarm Yöneticisini kullanırken dikkatli olmanız gerekir. Normalde, bir alarm yöneticisi bir dakikadan önce tekrar edemez. Ayrıca düşük güç modunda süre 15 dakikaya kadar çıkabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.