gpt4 book ai didi

android - Delphi Seattle Android TNotificationCenter CancelAll 在触发一个通知后不起作用

转载 作者:行者123 更新时间:2023-12-01 22:34:28 24 4
gpt4 key购买 nike

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

我似乎无法让 TNotificationCenter.CancelAll 在一个通知触发后实际取消通知
Similar Question Here

使用 Delphi 示例 SendCancelNotification作为基本代码
我将“立即发送通知”按钮更改为“发送多个通知”,代码如下所示

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;

单击按钮后会发送三个通知。
如果我点击“发送多个通知”按钮,然后在 5 秒之前点击“取消所有通知”按钮,则通知将成功取消。

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

但是,如果我单击多通知按钮并等到第一个通知触发,然后单击“取消所有通知”按钮,它不会取消剩余的通知。例如第二个和第三个通知仍在运行。

有人遇到过这种情况吗?或者对为什么 CancelAll 事件在发送通知之一后不起作用有任何想法

最佳答案

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

如果您遇到同样的问题,请将 Source code here 文件中的 System.Android.Notification.pas 复制到您的项目文件夹中并尝试一下

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

例如一=10#10二=11#10三=12变成 Two=11Three=12,然后取消全部没有获得名称匹配,并且永远不会取消两个或三个

我已经复制了
Embarcadero\Studio\17.0\source\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

关于android - Delphi Seattle Android TNotificationCenter CancelAll 在触发一个通知后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35906638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com