Delphi Seattle Android TNotificationCenter在一次通知被解雇后取消所有工作

时间:2016-03-10 02:44:37

标签: android delphi notifications firemonkey

我正在使用Delphi DX Seattle并在Android设备上进行测试 当用户点击按钮时,我创建了多个预定的通知 当用户点击另一个按钮时,我会清除剩余的通知

我似乎无法让TNotificationCenter.CancelAll在一次通知被解雇后实际取消通知<{3}}

使用Delphi样本Similar Question Here作为基本代码
我立即更改&#34;发送通知&#34;按钮到&#34;发送多个通知&#34;代码看起来像这样

procedure TNotificationsForm.btnSendMultipleNotificationsClick(
  Sender: TObject);

  procedure MyNotificationCreate(aNotificationName : String; aSecondDelay : Word);
  var
    Notification: TNotification;
  begin
    if (aSecondDelay < 0) or (aSecondDelay > 60) then
      raise Exception.Create('Seconds must be between 0 and 60');
    { verify if the service is actually supported }
    Notification := NotificationC.CreateNotification;
    try
      Notification.Name := aNotificationName;
      Notification.AlertBody := aNotificationName + ' ran after ' + inttostr(aSecondDelay) + ' seconds';

      { Fired in 10 second }
      Notification.FireDate := Now + EncodeTime(0,0,aSecondDelay,0);

      { Send notification in Notification Center }
      NotificationC.ScheduleNotification(Notification);
    finally
      Notification.DisposeOf;
    end;
  end;
begin
  MyNotificationCreate('First' , 5);
  MyNotificationCreate('Second', 10);
  MyNotificationCreate('Third' , 15);
end;

单击按钮后会发送三个通知 如果我点击&#34;发送多个通知&#34;按钮然后在5秒之前点击&#34;取消所有通知&#34;按钮通知被成功取消。

procedure TNotificationsForm.SpeedButton2Click(Sender: TObject);
begin
  NotificationC.CancelAll;
end;    

但如果我点击多重通知按钮并等到第一个通知被解雇,那么请点击&#34;取消所有通知&#34;按钮,它不会取消剩余的通知。例如第二和第三通知仍在运行。

有没有人碰到过这个?或者对于在发送其中一个通知后CancelAll事件无效的原因有任何想法

1 个答案:

答案 0 :(得分:0)

我找到了这个问题并且已经让它工作了 此解决方案要求您不要将数字编号作为通知名称的第一个字符 如果你能想出更好的方法来解决这个问题,请发表你的答案

如果您遇到同样的问题,请将System.Android.Notification.pas从Source code here文件复制到您的项目文件夹中并开始使用

发送三个或更多通知后,在Android上触发了第一个通知,通知丢失了#10字符。

e.g。一个= 10#10Two = 11#10Three = 12 正在成为两个= 11三= 12然后取消所有没有得到名称匹配,从来没有取消两个或三个

我已复制了 Embarcadero公司\工作室\ 17.0 \源\ RTL \ COMMON \ System.Android.Notification.pas
将文件存档到我的项目文件并对其进行修改以帮助更好地了解正在发生的事情

这是我用来帮助追踪问题的功能

function TAndroidPreferenceAdapter.GetAllNotificationsNames: TStringList;
var
  Notifications: TStringList;
  NotificationsStr: JString;
  I: Integer;
begin
  Notifications := TStringList.Create;
  NotificationsStr := FPreference.getString(TJNotificationAlarm.JavaClass.SETTINGS_NOTIFICATION_IDS, nil);
  Notifications.Text := JStringToString(NotificationsStr);
  for I := 0 to Notifications.Count - 1 do
    Notifications[I] := ExtractName(Notifications[I]);

  Result := Notifications;
end;

我最终做的是在字符串列表循环中检查超过1 =字符 如果有多于1个,则删除原始行然后从=字符循环原始字符串,直到出现非数字编号并将其重新插入字符串列表

function TAndroidPreferenceAdapter.GetAllNotificationsNamesNonFiltered: TStringList;
var
  Notifications: TStringList;
  NotificationsStr: JString;
  I: Integer;
  function OccurrencesOfChar(const S: string; const C: char): integer;
  var
    i: Integer;
  begin
    result := 0;
    for i := 1 to Length(S) do
      if S[i] = C then
        inc(result);
  end;

  function InsertLineBreaks(const S: string) : String;
  var sNewString, sRemaining : String;

      i : integer;
      const validChars = '0123456789';
  begin
    try
      sNewString := '';
      sRemaining := S;
      for I := pos('=',sRemaining,1) to length(sRemaining) -1 do begin
        if pos( sRemaining[i], validChars ) > 0 then begin
          //continue as its still an integer
        end else begin
          sNewString := copy( sRemaining, 0, i);
          sRemaining := copy( sRemaining, i+1, Length(s));
          if OccurrencesOfChar(sRemaining, '=') > 1  then begin
            InsertLineBreaks(sRemaining);
            sRemaining := '';
          end;
          break;
        end;
      end;
      if sNewString <> '' then
        Notifications.Add( sNewString ) ;
      if sRemaining <> '' then
        Notifications.Add( sRemaining ) ;
      Result := sNewString + sRemaining;
    except
      on E:Exception do begin
        e.Message := e.Message + #13#10 + 'fn[TAndroidPreferenceAdapter.GetAllNotificationsNamesNonFiltered.InsertLineBreaks]';
        raise;
      end;
    end;
  end;
var sTemp : String;
begin
  Notifications := TStringList.Create;
  NotificationsStr := FPreference.getString(TJNotificationAlarm.JavaClass.SETTINGS_NOTIFICATION_IDS, nil);
  Notifications.Text := JStringToString(NotificationsStr);

  for I := 0 to Notifications.Count - 1 do begin
    if OccurrencesOfChar(Notifications[I], '=') > 1 then begin
      sTemp := Notifications[I];
      Notifications.Delete( i );
      InsertLineBreaks( sTemp );
      break;
    end;
  end;

  Result := Notifications;
end;

我还必须改变调用

的任何地方
Notifications := TStringList.Create;
NotificationsStr := FPreference.getString(TJNotificationAlarm.JavaClass.SETTINGS_NOTIFICATION_IDS, nil);
Notifications.Text := JStringToString(NotificationsStr);

到新的GetAllNotificationsNamesNonFiltered

如果上面的内容没有意义Source code here

,请查看源代码