80

Мне нужно запустить блок кода через 20 минут после установки AlarmManager.Android: Как использовать AlarmManager

Может ли кто-нибудь показать мне пример кода о том, как использовать AlarmManager в Android?

Я несколько раз играл с кодом в течение нескольких дней, и это просто не сработает.

ответ

100

«Пример кода образца» не так просто, когда дело доходит до AlarmManager.

Вот фрагмент, показывающий установку 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); 

В этом примере я использую setRepeating(). Если вам нужен сигнал с одним выстрелом, вы просто используете set(). Обязательно укажите время запуска будильника в той же временной базе, что и в начальном параметре, до set(). В моем примере выше, я использую AlarmManager.ELAPSED_REALTIME_WAKEUP, поэтому моя временная база SystemClock.elapsedRealtime().

Here is a larger sample project показать эту технику.

+2

Еще раз. Спасибо за ответ. Если я куплю вашу книгу, это объяснит, как полностью реализовать диспетчер аварийных сигналов? – Tom

+7

Расширенная книга Android (версия 0.9) содержит ~ 9 страниц, охватывающих AlarmManager, WakeLocks и остальную часть этого примера. Это, вероятно, немного изменится в версии 1.0, поскольку я исправлю это в моем ответе выше. И если у вас есть вопросы относительно книги или ее пример кода, перейдите на http://groups.google.com/group/cw-android, и я буду рад ответить на них. – CommonsWare

+17

Любой разработчик Android должен иметь подписку на книги Марка :) По крайней мере один раз – Bostone

58

Есть несколько хороших примеров в андроида примере кода

. \ Android-SDK \ Samples \ андроид-10 \ ApiDemos \ SRC \ COM \ например \ Android \ APIs \ приложение

те, чтобы проверить, являются:

  • AlarmController.java
  • OneShotAlarm.java

Прежде всего, вам необходим приемник, который может прослушивать ваш сигнал тревоги при его срабатывании. Добавьте следующие строки в файл AndroidManifest.xml

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

Затем создайте следующий класс

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

Затем, чтобы вызвать тревогу, используйте следующее (например, в вашей основной деятельности):

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); 

.


Или, еще лучше, сделать класс, который обрабатывает все это и использовать его как этот

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

Таким образом, у вас есть все это в одном месте (не забудьте изменить 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(); 
    } 
} 
+1

Привет! Я тестировал этот код, и он был в меру штрафом (+1). но я попробовал это для нескольких сигналов тревоги (например, для 10 секунд, а другой для 15, а только для sencond). Я что-то делаю неправильно, или это какой-то король проблемы? EDIT: Хорошо, я нашел проблему здесь: http://stackoverflow.com/questions/2844274/multiple-calls-to-alarmmanager-setrepeating-deliver-the-same-intent-pendinginten –

+1

+1 для обращения к образцам SDK – Sundeep

+0

FWIW, я бы использовал статический метод а не конструктор для этого. –

2

Некоторые примеры кода, если вы хотите, чтобы вызвать службу из Alarmmanager:

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); 

Вам не нужно спрашивать пользователей.

+0

Что здесь ctx? – ssrp

+2

ctx is context :) – Duc

+0

Очень распространенная аббревиатура. –

7

Что вам нужно сделать, это сначала создать намерение, которое вам нужно запланировать. Затем получите ожидаемое действие этого намерения. Вы можете планировать мероприятия, услуги и трансляции. Для планирования деятельности, например MyActivity:

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

Подари эту pendingIntent в alarmManager:

//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); 

Теперь MyActivity будет запущен через 5 секунд после запуска приложения, независимо от того, как вы перестанете приложение или устройство перешло в состояние ожидания (из-за опции RTC_WAKEUP). Вы можете прочитать полный примерный код Scheduling activities, services and broadcasts #Android

+0

+1 отличный ответ, именно то, что мне нужно, пример рабочего «набора». –

3

Я хотел бы прокомментировать, но < 50 rep, так что здесь идет. Дружественные напоминание, что если вы работаете на 5.1 или выше, и вы используете интервал меньше, чем за минуту, это происходит:

Suspiciously short interval 5000 millis; expanding to 60 seconds 

См here.

 Смежные вопросы

  • Нет связанных вопросов^_^