2015-09-04 89 views
2

我正在Rad Studio XE8下的FireMonkey中構建一個應用程序。自定義通知間隔

我想對我的通知(FMX.Notification)具有自定義間隔。

但是通知重複只能設置爲特定的時間間隔。

TRepeatInterval = (None, Second, Minute, Hour, Day, Week, Weekday, Month, Quarter, Year, Era); 

如果我whant火每次15分鐘,我會真的需要創建四個通知(0,15,30,45分鐘),並重復他們TRepeatInterval(4)每隔一小時?

+1

標籤是德爾福xe8,我說這 –

+0

是的,我試着將它添加自己,但堆棧溢出說我需要15k點使用該標籤。 –

+1

不,你試圖添加一個新的標籤,也許'xe8'。你不能那樣做。您沒有創建標籤所需的代表。我使用的標籤是'delphi-xe8',並且已經存在了很長時間。您可以使用該標籤。所以,我只是想讓你知道delphi版本標籤的約定。他們都是那種形式。 –

回答

4

documentationFMX.Notification.TNotification.RepeatInterval說,我強調:

如果你想設置自定義的時間間隔,例如像30分鐘後,你需要創建兩個通知設定30分鐘的預定差異用FireDate和將兩個通知的重複間隔設置爲一小時

你猜對了。您需要創建四個通知並每小時重複一次。


OP告訴記者,在評論中,他用下面的代碼,進行到底。我將它包含在我的答案中以提高他所提供信息的可讀性。

//Repeat very 5 minutes 
//Create 12 notifications fireing every hour with 5 minute intervals Notification.RepeatInterval := TRepeatInterval.Hour; 
for I := 0 to 11 do 
begin 
    Notification.FireDate := Notification.FireDate + EncodeTime(0,(I*5),0,0); 
    ANotificationcenter.ScheduleNotification(Notification); 
end; 
+0

我終於使用的代碼。 '//重複非常5分鐘 //創建12個通知每隔5分鐘間隔每小時觸發一次 Notification.RepeatInterval:= TRepeatInterval.Hour; for I:= 1 to 12 do begin Notification.FireDate:= Notification.FireDate + EncodeTime(0,(I * 5),0,0); ANotificationcenter.ScheduleNotification(Notification); 結束; end;' –

+0

爲了提高可讀性,我在回答中包含了您的代碼。希望,沒關係。 –

+1

這很好。我剛剛看到for循環中的那個範圍會導致EncodeTime中的錯誤,應該是0-11。 –

1

只需添加到勒內·霍夫曼的回答

爲什麼你只能使用那些重複間隔的原因是因爲你可以不設置與iOS, 定製的重複間隔,因爲它使用了UILocalNotification對象及其RepeatInterval需要NSCalendarUnit這是一個枚舉類型。

https://developer.apple.com/library/ios/documentation/iPhone/Reference/UILocalNotification_Class/#//apple_ref/occ/instp/UILocalNotification/repeatInterval

而Android在otherhand,如果你想使一個重複的通知,你可以使用AlarmManager.setRepeating方法 所以如果你想使本地重複通知,將針對Android,你可以做這方面的工作:

TNotification駐留在System.Notification 屬性添加到它:

{$IFDEF ANDROID} 
    RepeatIntervalinMills : Integer; 
{$ENDIF} 

TNotification.Create只是給它一個默認值

{$IFDEF ANDROID} 
    RepeatIntervalinMills := 0; 
{$ENDIF} 

現在,我們需要添加原生的Android方法來設置重複的通知,要做到這一點,你需要導航到System.Android.Notification

找到TNotificationCenterAndroid.DoScheduleNotification,現在只需要添加一些代碼,所以如果你沒有指定RepeatIntervalinMills只創建標準通知:當您創建通知

begin 
    if not ANotification.Name.IsEmpty and FExternalStore.Contains(ANotification.Name) then 
    CancelNotification(ANotification.Name); 

    ID := TGeneratorUniqueID.GenerateID; 
    PendingIntent := CreateNotificationAlarmIntent(ID); 
    FExternalStore.SaveNotification(ANotification, ID); 

    if ANotification.RepeatIntervalinMills <> 0 then 
    begin 
     TAndroidHelper.AlarmManager.setRepeating(TJAlarmManager.JavaClass.RTC_WAKEUP, DateTimeLocalToUnixMSecGMT(ANotification.FireDate), 
    ANotification.RepeatIntervalinMills,PendingIntent); 
    end 
    else 
    TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, DateTimeLocalToUnixMSecGMT(ANotification.FireDate), 
    PendingIntent); 
end; 

現在:

MyNotification := NotificationCenter1.CreateNotification; 
    try 
     MyNotification.Name := 'MyNotification'; 
     MyNotification.AlertBody := 'Hello!'; 
     {$IFDEF IOS} 
     //Repeat very 5 minutes 
     //Create 12 notifications fireing every hour with 5 minute intervals     Notification.RepeatInterval := TRepeatInterval.Hour; 
     for I := 0 to 11 do 
     begin 
      Notification.FireDate := Notification.FireDate + EncodeTime(0,(I*5),0,0); 
      ANotificationcenter.ScheduleNotification(Notification); 
     end; 
     {$ENDIF} 
     {$IFDEF ANDROID} 
     MyNotification.FireDate := IncMinute(Now,5); 
     MyNotification.RepeatIntervalinMills := 300000; //Now you can specify your Custom Android Repeat interval 
     NotificationCenter1.ScheduleNotification(MyNotification); 
     {$ENDIF} 
    finally 
     MyNotification.DisposeOf; 
    end; 

這將創建一個notfication將火5分鐘,將重複每5分鐘