2014-06-18 80 views
0

我有這個靜態輔助功能,設定每日重複的報警:澄清對AlarmManager的行爲

public static void setAlarm(Context context, int hh, int mm) 
{ 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, hh); 
    calendar.set(Calendar.MINUTE, mm); 

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intentAlarm = new Intent(context, AlarmReciever.class); 
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intentAlarm, 0); 

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent); 
} 

我有三個地方,這個輔助函數被調用:

  1. 當設備啓動時,我想重新註冊鬧鐘:

    @Override 
    public void onReceive(Context context, Intent intent) { 
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
         setAlarm(context, 7, 00); 
        } 
    } 
    
  2. 在我的一項活動中,c所有這ActivityA:

    AlarmReciever.setAlarm(ActivityA.this, 7, 00);

  3. 在另一個活動,稱之爲ActivityB:

    AlarmReciever.setAlarm(ActivityB.this, 7, 00);

問題:

  1. 會發生什麼,如果所有這三種setAlarm()被調用?我擔心他們沒有相同的背景。將Android知道他們是相同的PendingIntent,只有一次火災?我希望它只在上午7點發射一次。

  2. 如果我在ActivityA中按下setAlarm按鈕幾次,所以相同的警報設置具有相同的上下文和意圖,如果上午7點到來,有多少人會觸發?

  3. 說今天早上7點解僱了,現在是下午2點。我現在按下ActivityA中的按鈕。警報會立即觸發(測試),因爲上午7點是「過去的時間」。但在添加新警報之前,系統不應該檢查現有警報,並意識到這是一個重複的意圖,並且已經在早上7點發射了一個。在我看來,它應該忽略我在下午2點要求的setAlarm()。

回答

0

對於它的價值,我做過實驗,我張貼在這裏的結果的情況下,任何人都奇觀:只要PendingIntent是相同

  1. ,機器人才會觸發報警一旦。無論您想要什麼活動/課程,您都可以多次設置鬧鐘。

  2. 一。

  3. 新的警報只會觸發正確的方式(因爲上午7點是「過去的時間」)。你可以編寫代碼來記錄上次被觸發的日期/時間(例如使用SharedPreferences),並在那裏做一些邏輯,或者取決於你的情況,你可能想要安排鬧鐘在第二天早上7點發射(做一個加號一天的Calendar對象)。