AlarmManager没有正确重复

时间:2015-11-25 01:37:32

标签: java android alarmmanager

我尝试每天重复通知(对于调试我将其设置为每10秒)。但是,它只是第一次触发通知,然后没有任何反应。

以下是设置闹钟的代码:

package

这是服务:

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后设置新警报。

3 个答案:

答案 0 :(得分:0)

PendingIntent使用BroadcastReceiver而不是Service,这是推荐(并记录在案)的做法。另外,如果您使用“唤醒”警报,则需要使用BroadcastReceiver,否则系统将无法保证其保持清醒足够长的时间以使Service实际执行并接收Intent 1}}。有关详细信息,请参阅此文章:http://po.st/7UpipA

答案 1 :(得分: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();
            }

        }

<强>广播接收器

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

答案 2 :(得分: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