2013-04-27 2 views
0

Как вы посоветовали мне использовать AlarmManager вместо Timer, я думал, программа запустится.
Но, к сожалению, это не так. Или, лучше сказать, не всегда ...AlarmManager не работает так, как ожидалось

Это мой код:

long millis = 0; 

this.alarmMgr = (AlarmManager)this.main.getSystemService(Context.ALARM_SERVICE); 

this.checkPendingIntent = PendingIntent.getBroadcast(this.main, 0, 
       new Intent(this.main, AlarmReceiver.class), 0); 

if(frequency.compareTo("1HOUR") == 0) 
    millis = 3600 * 1000; 
if(frequency.compareTo("12HOUR") == 0) 
    millis = 12 * 3600 * 1000; 
if(frequency.compareTo("1DAY") == 0) 
    millis = 24 * 3600 * 1000; 
if(frequency.compareTo("1WEEK") == 0) 
    millis = 7 * 24 * 3600 * 1000; 

this.alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, 
     System.currentTimeMillis(), millis, this.checkPendingIntent); 

Я ожидаю, что в ожидании намерения (AlarmReceiver) будет вызываться каждые X миллисекунд, но это не так.
В журналах моего телефона я вижу, что он не будет вызываться, а в журнале моего сервера (получатель отправляет HTTP-запрос), что запросы не принимаются.

ОЧЕНЬ странно, что когда-то оно работает, но я не могу воспроизвести ситуацию.

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

Большое спасибо
Luca Bertoncello

ответ

0

Это простой пример того, как использовать аварийный сигнал

Calendar now = Calendar.getInstance(); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, yourHour); 
calendar.set(Calendar.MINUTE, yourMin); 
calendar.set(Calendar.SECOND, youSec); 

if (calendar.before(now)) { //if time passed 
    calendar.add(Calendar.DATE,1); 
} 
Intent intent = new Intent(Context.this, DestinationActivity.class); 
PendingIntent pendingIntent = PendingIntent.getActivity 
       (Settings.this,123456, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
             AlarmManager.INTERVAL_DAY,pendingIntent); 

Используйте setRepeating, если вы хотите, чтобы ваш сигнал будет повторяться ежедневно.
Если вы не хотите использовать setAlarm (.., .., .., ..) вместо

+0

Спасибо, я попробую. Не могли бы вы просто объяснить мне, почему вы используете setTimeInMillis для календаря, а затем снова calendar.set? –

+0

Ну, похоже, это сработало ... Я проверю ваш пример сегодня и завтра, ожидая запроса каждый час. Большое спасибо –

+0

@LucaBertoncello Вы можете установить будильник, а затем изменить время установки. Когда придет время будильника, будильник будет запущен. Пожалуйста, если вы найдете мой ответ полезным, проголосуйте за него и примите его в качестве ответа. –

0

чек из this-

Intent intentalarm = new Intent("com.mubble.powercutsensorapp.MYTIMER"); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intentalarm, 0); 
    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    long now = System.currentTimeMillis(); 
    long interval = 24*60 * 60 * 1000; // 24 hour 
    manager.setRepeating(AlarmManager.RTC_WAKEUP, now + interval, interval, 
     pendingIntent); 
Смежные вопросы