【问题标题】:Custom notification interval自定义通知间隔
【发布时间】:2015-11-30 15:23:43
【问题描述】:

我正在 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) 每小时重复一次吗?

【问题讨论】:

  • 标签是delphi-xe8,我加了
  • 是的,我尝试自己添加它,但堆栈溢出说我需要 15k 点才能使用该标签。
  • 不,您尝试添加一个新标签,可能是xe8。而你不能那样做。您没有创建标签所需的代表。我使用的标签是delphi-xe8,并且已经存在很长时间了。你可以使用那个标签。所以,我只是想让你知道 delphi 版本标签的约定。它们都是那种形式。

标签: delphi firemonkey delphi-xe8


【解决方案1】:

只是为了补充 René Hoffmann 的回答

你只能使用那些重复间隔的原因是因为你不能用 iOS 设置自定义重复间隔, 因为它使用了它的UILocalNotification 对象,并且它的RepeatInterval 需要一个NSCalendarUnit,它是一个枚举类型。

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

但是在另一方面,如果你想发出重复通知,你可以使用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 分钟重复一次的通知

【讨论】:

    【解决方案2】:

    FMX.Notification.TNotification.RepeatIntervaldocumentation 表示,我强调:

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

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


    OP 在 cmets 中告诉他,他最后使用了以下代码。我将其包含在我的答案中以提高他给定信息的可读性。

    //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;
    

    【讨论】:

    • 我最后用的代码。 //Repeat very 5 minutes //Create 12 notifications fireing every hour with 5 minute intervals 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; end;
    • 我将您的代码包含在我的答案中以提高可读性。希望,没关系。
    • 没关系。刚刚看到for循环中那个范围会导致EncodeTime出错,应该是0-11。
    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多