在每天的特定时间设置启动时间的警报

时间:2014-06-19 07:05:18

标签: android broadcastreceiver alarmmanager repeatingalarm

我已经在启动完成时在android的9:00 AM启动了警报。但是在完成启动后每分钟都会发出警报。

我的要求是它应该在启动后设置警报,但仅在上午9:00触发警报。

这是我的代码:     公共类AlarmUtil {     private PendingIntent alarmIntent;

public static void setAlarm(Context context) {

    AlarmManager alarmManager = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 9);
    calendar.set(Calendar.MINUTE, 00);
    calendar.set(Calendar.SECOND, 00);
    calendar.set(Calendar.AM_PM, Calendar.AM);
    //calendar.setTimeInMillis(calendar.getTimeInMillis());
    calendar.add(Calendar.SECOND, 1);

    Intent intent = new Intent(context, Services.class);
    PendingIntent pintent = PendingIntent.getService(context, 123456789,
            intent, 0);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(), 1 * 60 * 1000, pintent);

}
}

public class AlarmBroadcastReciever extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
        Toast.makeText(context, "Booted!", Toast.LENGTH_SHORT).show();
        AlarmUtil.setAlarm(context);

    }
}
}

服务(我的服务类)

public class Services extends IntentService {

public Services(String name) {
    super("services");
    // TODO Auto-generated constructor stub
}

public Services() {
    super("services");
    // TODO Auto-generated constructor stub
}

@Override
public void onCreate() {
    super.onCreate();

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    MyApp.counter += 1;

    Toast.makeText(getApplicationContext(),
            "Service started: " + MyApp.counter, Toast.LENGTH_LONG).show();
    return START_STICKY;
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
protected void onHandleIntent(Intent intent) {
    Toast.makeText(getApplicationContext(), "handling intent",
            Toast.LENGTH_LONG).show();

}

}

我缺乏的地方。请帮我。提前谢谢。

3 个答案:

答案 0 :(得分:5)

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
        calendar.getTimeInMillis(), 1 * 60 * 1000, pintent);

通过调用setRepeating(),您指示它每分钟触发一次意图。您可能打算使用set()setExact()代替。

此外,您还要在当前日期<9> 设置闹钟。我不完全确定你的目标是什么,但是如果你想要接下来9:00&#34; (例如作为闹钟)如果当前时间大于9:00,您应该添加一天。来自文档:

  

如果声明的触发时间是过去的,则会触发警报   立即

编辑:如果你需要的是每天9点发出此闹钟,那么setRepeating()是正确的,但是以毫秒为单位的时间应该是是AlarmManager.INTERVAL_DAY。但请注意有关过去警报的说明。如果您在上午10:00启动手机,并且使用当前代码,除了未来之外,您还会收到立即警报。

并且,正如@DerGolem所指出的那样,如果您将API级别19定位,那么这些警报将是不精确的(并且没有setRepeatingExact())。如果您需要完全警报,那么您必须安排一个setExact(),然后安排下一个警报,依此类推。

答案 1 :(得分:1)

你需要更换&#34; 1 * 60 * 1000&#34;使用AlarmManager.INTERVAL_DAY进行日常设置

答案 2 :(得分:1)

您好我使用了以下代码并且能够在每天上午9点生成闹钟

alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlarmService.class);

    PendingIntent pintent = PendingIntent.getService(this, 123456789,
            intent, 0);

    // Set the alarm to start at 8:30 a.m.
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 9);
    calendar.set(Calendar.MINUTE, 00);


    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(), 1000 * 60 * 1 * 60 * 24, pintent);