我正在使用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事件无效的原因有任何想法
答案 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
,请查看源代码