2015-11-25 3 views
0

Я пытаюсь ежедневно получать уведомление (для отладки я установил его каждые 10 секунд). Тем не менее, он запускает уведомление только в первый раз, затем ничего не происходит.AlarmManager не повторяется правильно

Вот код, где установлен предупреждающий сигнал:

Intent myIntent = new Intent(ctx , NotifyService.class); 
AlarmManager alarmManager =(AlarmManager)ctx.getSystemService(ALARM_SERVICE); 
PendingIntent pendingIntent = PendingIntent.getService(ctx, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

Calendar calendar = Calendar.getInstance(); 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), 1000 * 10, pendingIntent); 

и здесь сервис:

public class NotifyService extends Service { 
    public NotifyService() { 

    } 

    @Override 
    public void onCreate(){ 
     //Create and Emit the notification. 
    } 

Я пробовал разные флаги в getService(ctx, int, Intent, flags), чтобы использовать setInexactRepeating и установить новый после каждого звонка на NotifyService.

+0

Try изменения setRepeating() для setInexactRepeating() для ИЗА> = 19 – phongvan

ответ

0

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

Найти official doc.

 private final static String ACTION = "ACTION_ALARM"; 
    public static void setWakeUpAction(Context context, String hourSet, String minuteSet, String periodSet, int requestCode, String currentAction) { 
      try { 
       String mHour = hourSet; 
       String mMin = minuteSet; 
       String[] parsedFormat = null; 
       Calendar calendar = Calendar.getInstance(); 
       SimpleDateFormat displayFormat = new SimpleDateFormat("HH:mm"); 
       SimpleDateFormat parseFormat = new SimpleDateFormat("hh:mm a"); 
       Date date = parseFormat.parse(mHour + ":" + mMin + " " + periodSet); 
       parsedFormat = displayFormat.format(date).split(":"); 
       mHour = parsedFormat[0]; 
       mMin = parsedFormat[1]; 
       calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(mHour)); 
       calendar.set(Calendar.MINUTE, Integer.parseInt(mMin)); 
       calendar.set(Calendar.SECOND, 00); 
       Intent myIntent = new Intent(context, MyReceiver.class); 
       myIntent.putExtra(ACTION, currentAction); 
       myIntent.putExtra("Time", new String[]{mHour, mMin, periodSet}); 
       PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
       AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
       alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 
         AlarmManager.INTERVAL_DAY, pendingIntent); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 

     } 

BroadcastReceiver

public class MyReceiver extends BroadcastReceiver { 

    private final String ACTION = "ACTION_ALARM"; 
    private String ACTION_ONE = "ALARM_REPEAT"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     try { 
      String action = intent.getStringExtra(ACTION); 
      new ShowToast(context, action); 
      if (action.length() > 1) { 
       if (action.equals(ACTION_ONE)) { 
        String time[] = intent.getStringArrayExtra("Time"); 
        startService(context, action); 
       } 
      } 
     } catch (Exception e) { 
     } 

    } 

    public void startService(Context context, String action) { 
     Intent service1 = new Intent(context, NotifyService.class); 
     service1.putExtra(ACTION, action); 
     context.startService(service1); 
    } 

} 

манифеста

<service 
     android:name=".NotifyService" 
     android:enabled="true" /> 

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

Использование

setWakeUpAction(context, "11", "00","AM","0", "ALARM_REPEAT"); 
0

Используйте PendingIntent для BroadcastReceiver, а не Service, то есть рекомендуемую (и задокументированную) практику. Кроме того, если вы используете аварийные сигналы «пробуждения», вам необходимо использовать BroadcastReceiver, иначе система не будет гарантировать, что он будет достаточно долго, чтобы ваш Service фактически выполнил и получил Intent. См. Эту статью для получения более подробной информации: http://po.st/7UpipA

0

Попробуйте это,

alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmReceiver.class); 
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

// setRepeating() lets you specify a precise custom interval--in this case, 
// 10 seconds. 
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
     1000 * 10, alarmIntent); 

См: http://developer.android.com/training/scheduling/alarms.html

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