Delphi Seattle Android TNotificationCenter CancelAll не работает после того, как одно уведомление уволено

77
7

Я использую Delphi DX Seattle и тестирование на Android-устройстве
когда пользователь нажимает кнопку Я создаю несколько запланированных уведомлений
и когда пользователь нажимает на другую кнопку, освобождая оставшиеся уведомления

Я не могу заставить TNotificationCenter.CancelAll фактически отменить уведомления после того, как одно уведомление уволено
Похожие вопросы здесь

Использование примера 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;

Но если я нажму кнопку много уведомлений и дождитесь, пока первое уведомление не поступит, нажмите кнопку "Отменить все уведомления", она не отменяет остальные уведомления. например, уведомления Second и Third все еще выполняются.

Кто-нибудь сталкивался с этим? или какие-либо идеи о том, почему событие CancelAll не работает после того, как одно из уведомлений было отправлено

спросил(а) 2016-03-10T05:44:00+03:00 5 лет, 3 месяца назад
1
Решение
63

Я нашел проблему и получил ее на работу
это решение требует, чтобы у вас не было числового номера в качестве первого символа имени вашего уведомления
если вы можете придумать лучший способ решить эту проблему, отправьте свой ответ

если вы используете ту же проблему, то скопируйте файл System.Android.Notification.pas из исходного кода здесь в папку проекта и отпустите его

после отправки трех или более уведомлений, и первое уведомление запускается на андроиде, а уведомления теряют символ # 10.

например one = 10 # 10Two = 11 # 10Three = 12 становится 2 = 11Three = 12, а затем отменить все не получилось совпадение имени и никогда не отменяет два или три

Я скопировал
Embarcadero\Studio\17,0\источник\РТЛ\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

посмотрите исходный код, если что-то выше не имеет смысла. Исходный код здесь

ответил(а) 2016-03-14T10:18:00+03:00 5 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема