使用警报管理器安排通知

时间:2014-02-23 05:22:26

标签: android alarmmanager intentservice

我的alarmManager遇到了一个小问题。我正在尝试注册一个警报,以便在spicified时间显示通知。我正是这样做的:

Utils.SetAlarm(this, Utils.GOODMORNING, 7, 0, 0); // so at 7:00

public static void SetAlarm(Context context, int req, int hour, int minute, int second) {
    AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
    Intent intent = new Intent(context, myService.class);
    intent.putExtra(ACTION_REQUEST, req);
    PendingIntent pi = PendingIntent.getService(context, 0, intent, 0);

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, second);

    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
}

public class myService extends IntentService {
private static final int GOODMORNING_NOTIFICATION_REQUEST = 517;

public myService() {
    super("myService");
}

@Override
protected void onHandleIntent(Intent intent) {
    int extra = intent.getIntExtra(Utils.ACTION_REQUEST, 0);

    if (extra == Utils.GOODMORNING) {
        Notification notification = new Notification.Builder(this)
                .setContentTitle("title")
                .setContentText("content")
                .setSmallIcon(R.drawable.ic_launcher)
                .setAutoCancel(true)
                .build();

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notificationManager.notify(GOODMORNING_NOTIFICATION_REQUEST, notification);
    }
}

我面临的问题是,在我运行Utils.SetAlarm void后,通知立即出现。它也会在上午7点看起来很好,所以它显然有效,但我想知道是否有人知道如何避免这个问题。感谢

2 个答案:

答案 0 :(得分:2)

在您运行Utils.SetAlarm void之后,您正面临通知立即出现。因为早上7点可能已经在您的设备中完成,所以它似乎在该实例处工作。所以尝试在当前时间为第二天设置警报大于闹钟时间

试试这个

Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, second);
long time=calendar.getTimeInMillis();

if(time<System.currentTimeMillis()){
    time=time+AlarmManager.INTERVAL_DAY;
}

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,time,
    AlarmManager.INTERVAL_DAY, alarmIntent);

答案 1 :(得分:0)

为您的解决方案使用以下代码: 我使用了评论,因此您可以轻松理解

// time at which alarm will be scheduled here alarm is scheduled at 1
// day from current time,
// we fetch the current time in milliseconds and added 1 day time
// i.e. 24*60*60*1000= 86,400,000 milliseconds in a day
Long time = selectedMilli;

// create an Intent and set the class which will execute when Alarm
// triggers, here we have
// given AlarmReciever in the Intent, the onRecieve() method of this
// class will execute when
// alarm triggers and
// we will write the code to send SMS inside onRecieve() method pf
// Alarmreciever class

Intent intentAlarm = new Intent(ScheduleActivity1.this,
        AlarmReciever.class);

// create the object
AlarmManager alarmManager = (AlarmManager) this
        .getSystemService(Context.ALARM_SERVICE);

// set the alarm for particular time
alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent
        .getBroadcast(this, i, intentAlarm,
                PendingIntent.FLAG_UPDATE_CURRENT));
/*
 * alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
 * time,TimeUnit.MINUTES.toMillis(1), PendingIntent.getBroadcast(this,
 * i, intentAlarm,PendingIntent.FLAG_UPDATE_CURRENT));
 */
// alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
// time,AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(this, i,
// intentAlarm,PendingIntent.FLAG_UPDATE_CURRENT));
// Toast.makeText(ScheduleActivity1.this,
// "Alarm Scheduled for " + selectedMilli, Toast.LENGTH_LONG)
// .show();