Ayarlandıktan 20 dakika sonra bir kod bloğu tetiklemem gerekiyor AlarmManager
.
Biri bana AlarmManager
Android'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:
"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 .
Android örnek kodunda bazı iyi örnekler var
. \ android-sdk \ samples \ android-10 \ ApiDemos \ src \ com \ example \ android \ apis \ app
Kontrol edilecekler:
Ö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();
}
}
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
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.
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.