2015-08-16 40 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