AlarmManager 没有正确重复

AlarmManager not repeating correctly

我尝试每天重复一次通知(为了调试,我将其设置为每 10 秒一次)。但是,它仅在第一次触发通知,然后什么也没有发生。

这里是设置闹钟的代码:

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 后设置新的闹钟。

使用 PendingIntent 作为 BroadcastReceiver 而不是 Service,这是推荐的(并记录在案的)做法。另外,如果您正在使用 "wakeup" 闹钟,则需要使用 BroadcastReceiver 否则系统将无法保证它保持清醒的时间足以让您的 Service 实际执行和接收Intent。有关详细信息,请参阅本文:http://po.st/7UpipA

使用下面的方法每天重复一次闹钟,你必须注册广播接收器而不是服务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");

试试这个,

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