自定义通知间隔

时间:2015-09-04 12:50:43

标签: delphi firemonkey delphi-xe8

我正在Rad Studio XE8下的FireMonkey中构建一个应用程序。

我希望在我的通知上有自定义间隔(FMX.Notification)。

但是,通知重复只能设置为特定的时间间隔。

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

如果我每15分钟要开一次,我真的需要创建四个通知(0,15,30,45分钟)并用TRepeatInterval(4)每小时重复一次吗?

2 个答案:

答案 0 :(得分:4)

FMX.Notification.TNotification.RepeatInterval的{​​{3}}说明了我的重点:

  

如果您想设置自定义时间间隔(例如30分钟),需要创建两个通知,使用FireDate设置30分钟的预定差异,设置两者的重复间隔通知到一小时

你猜对了。您需要创建四个通知并每小时重复一次。

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;

答案 1 :(得分:1)

只是加入RenéHoffmann的回答

您只能使用这些重复间隔的原因是您无法使用iOS设置自定义重复间隔, 因为它使用其UILocalNotification对象,其 RepeatInterval 需要NSCalendarUnit这是枚举类型。

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

但Android另一方面,如果您想要重复通知,可以使用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;

这将创建一个将在5分钟内发射并将每5分钟重复一次的通知