2015-08-16 76 views
1

TL; DR - AlarmManager .setRepeating基本上我开始警报管理器立即启动,而所期望的未来时间..(从例如5分钟现在)的Android重复报警管理器衬托立即

所以我给它剩下的时间来操作,由于某种原因,它会立即发射..用户正在从时间选择器中选择一个时间,并且我将这个时间设置为下一个闹钟。 代码如下:

- 此方法得到的时间,直到报警,这是用作为alarmManager的triggerInMillis。

/** calculate the time left until the alarm with calendar */ 
private static long getTimeFromCalendar(final int hourOfDay, final int minute) { 

    Date dat = new Date();//initializes to now 
    Calendar cal_alarm = Calendar.getInstance(); 
    Calendar cal_now = Calendar.getInstance(); 
    cal_now.setTime(dat); 
    cal_alarm.setTime(dat); 
    cal_alarm.set(Calendar.HOUR_OF_DAY,hourOfDay); 
    cal_alarm.set(Calendar.MINUTE, minute); 
    cal_alarm.set(Calendar.SECOND,0); 

    if(cal_alarm.before(cal_now)){ 
     cal_alarm.add(Calendar.DATE,1); 
    } 

    long calAlarm = cal_alarm.getTimeInMillis(); 
    long calNow = cal_now.getTimeInMillis(); 

    long timeLeft = (calAlarm - calNow); 

    return timeLeft; 
} 

然后我称之为-startAlarm-方法:

private static void startAlarm(final Enums typeToStart) { 

    final PendingIntent pendingIntent = GBAlarms.createPendingIntent(OnAlarmReceiver.class, Constants.typeEnum, typeToStart); 
    final long timeToAlarm = Utils.getTimeToAlarm(typeToStart); 
    long repeatTime = Constants._24hours; 

    GBAlarms.createRepeatingAlarm(timeToAlarm, repeatTime, pendingIntent); 
} 

最后,我-GBAlarms.class-在那里我创造我报警和未决意图。

public class GBAlarms { 

    /** Define our AlarmManager */ 
    private static AlarmManager mgr = (AlarmManager) BaseApplication.getAppContext().getSystemService(Context.ALARM_SERVICE); 

    /** Create a new PendingIntent */ 
    public static PendingIntent createPendingIntent(final Class destination, @Nullable final String extra, Enums.TeaType type) { 
     Intent i = new Intent(BaseApplication.getAppContext(), destination); 
     if (extra != null && type != null) { i.putExtra(extra, type); } 
     PendingIntent pi = PendingIntent.getBroadcast(BaseApplication.getAppContext(), type.getValue() , i, 0); 
     return pi; 
    } 

    /** Create a new repeating Alarm */ 
    public static void createRepeatingAlarm(final long time, final long repeatTime, final PendingIntent pi) { 
     mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, repeatTime, pi); 
    } 

} 

我不明白,出于某种原因,当我在-createRepeatingAlarm-方法对其进行设置,我当然调试的报警权弹出,时间参数看起来合法的..如果我将它设置为3分钟,10分钟,它把那个时间留在触发器..

任何人都可以发现我的错误?也许我错过了什么?

非常感谢您的帮助。

+0

会像这样:mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime()+ repeatTime,repeatTime,pi)更好吗? –

回答

0

请尝试使用RTC_WAKEUP和开关

long timeLeft = (calAlarm - calNow); 

只有calAlarm

您不需要离开纺织厂,你需要,你希望它弹出工厂。

0

您正在创建“挂起”警报, 在特定时间间隔后重复的警报。

诀窍是在您开始的那一刻取消当前闹钟。

看看下面的代码:你要调用的方法getBroadcast与你为什么要使用ELAPSED_TIME的 标志PendingIntent.CANCEL_CURRENT

AlarmManager alarmMgr; 
PendingIntent pendingIntent; 

public void startAlarmManager() 
    { 
     Intent dialogIntent = new Intent(getBaseContext(), AlarmBroadcastReceiver.class); 
       alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
       pendingIntent = PendingIntent.getBroadcast(this, 0, dialogIntent,PendingIntent.FLAG_CANCEL_CURRENT); 

       alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), 10000, pendingIntent); 

      } 
    } 
+0

我有点不同意你的答案。我目前没有当前的警报。首先,我总是在拨打新电话之前取消闹钟,第二次,当我刚刚安装了100%没有当前闹钟时,它也发生了 – JozeRi