2013-02-20 17 views
2

我正在實施AlarmManager來爲我的應用程序請求更新,每天只發生一次。我不希望鬧鐘一旦產生,鬧鐘就會關閉。爲此,我創建了一個日曆對象。爲什麼我的下面的實現是在警報不應該熄滅的時候觸發警報?

無論何時創建警報,它也會觸發。請注意,這並不總是發生。 我注意到這個問題只發生在一天中的某個時間。我住在香港,希望沒有任何問題,因爲我的時區。而不是使用AlarmManager.INTERVAL_DAY,我也嘗試使用24 * 60 * 60 * 1000。 只有在日曆紙廠比當前紙廠老時纔會發生這種情況。我將檢查當前時間是否較新,並在刪除此問題之前在日曆對象中添加24 * 60 * 60 * 1000。

這是一個創建AlarmManager的服務。此服務也將在啓動時啓動。只是爲了確保dataPreferenceObj,它是我的應用程序中DataPreference類的一個實例,它處理與我的應用程序相關的SharedPreferences調用。 ACTION_SCHEDULE_ALARM是Keys ENUM類的一部分,它包含所有字符串常量。

public class TukiService extends Service { 

private static AlarmManager calendarAlarmManager; 
private static PendingIntent calendarPendingIntent; 
private static final int SCHEDULE_REQUEST_CODE = 1001; 

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

    updateScheduleUpdate(); 
} 

private static void updateScheduleUpdate() { 

    if (dataPreferenceObj.getEnabledUpdate() == true) { 
     cancelScheduleUpdate(); 
     requestScheduleUpdate(); 
    } else if (dataPreferenceObj.getEnabledUpdate() == false) { 
     cancelScheduleUpdate(); 
    } 
} 

private static void requestScheduleUpdate() { 
    setScheduleAlarmParamaters(); 

    Calendar calendar = new GregorianCalendar(); 
    calendar.set(Calendar.HOUR_OF_DAY, 9); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 

    scheduleAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
      calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, 
      schedulePendingIntent); 
} 

/* 
* Cancels an existing alarm if user doesn't want to auto update. 
*/ 
private static void cancelScheduleUpdate() { 
    setScheduleAlarmParamaters(); 
    scheduleAlarmManager.cancel(schedulePendingIntent); 
} 

private static void setScheduleAlarmParamaters() { 
    Intent intent = new Intent(Keys.ACTION_SCHEDULE_ALARM.toString(), 
      Uri.parse(Long.toString(SCHEDULE_REQUEST_CODE)), context, 
      AlarmReceiver.class); 

    schedulePendingIntent = PendingIntent.getBroadcast(mContext, 
      SCHEDULE_REQUEST_CODE, intent, 
      PendingIntent.FLAG_UPDATE_CURRENT); 

    scheduleAlarmManager = (AlarmManager) mContext 
      .getSystemService(Context.ALARM_SERVICE); 
} 

}

這裏是接收廣播的廣播接收器:

public class ScheduleReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 

    if (intent.getAction().equals(Keys.ACTION_SCHEDULE_ALARM.toString())) { 

     if (TukiService.SCHEDULE_REQUEST_CODE == Long.parseLong(intent 
       .getData().getSchemeSpecificPart())) { 
      new NetworkHandler(context).fetchAutoEnabledUpdate(); 
     } 
    } 
} 

}

這裏是在mainfest我的接收機聲明:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <receiver 
     android:name="com.milanix.tuki.service.ScheduleReceiver" 
     android:enabled="true" > 
    </receiver> 
    <service android:name="com.milanix.tuki.service.TukiService" > 
    </service> 

回答

4

我現在已經解決了這個問題。這似乎是,如果triggerAtMillis比currentMillis更老,無論設置它,警報都會被觸發。我寫了下面的代碼來檢查triggerAtMillis是否比currentMillis早。如果它大於我們將在triggerAtMillis中添加一天時間間隔。現在無論什麼時候我設置鬧鐘,它總是會在準確的時間開火,如果鬧鐘時間過去,它會在第二天同時開始。這裏是代碼爲:

public static final int INTERVAL_DAY = 24 * 60 * 60 * 1000; 

private static void requestScheduleUpdate() { 
    setScheduleAlarmParamaters(); 

    Calendar calendar = new GregorianCalendar(); 
    calendar.set(Calendar.HOUR_OF_DAY, 15); 
    calendar.set(Calendar.MINUTE, 55); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 

    long triggerMillis = calendar.getTimeInMillis(); 

    if (calendar.getTimeInMillis() < Calendar.getInstance() 
      .getTimeInMillis()) { 
     triggerMillis = calendar.getTimeInMillis() + INTERVAL_DAY; 

     System.out.println("Alarm will go off next day"); 
    } 

    scheduleAlarmManager 
      .setRepeating(AlarmManager.RTC_WAKEUP, triggerMillis, 
        AlarmManager.INTERVAL_DAY, schedulePendingIntent); 
} 

這將是偉大的,如果任何人都可以指出比這更好的解決方案。

+0

到目前爲止,它對我來說工作得很好。 – 2016-05-08 08:43:57