Теперь этот код займет несколько страниц для полного описания. Вы можете использовать любые части, которые подходят для вашего приложения. Это рабочий код из моего приложения, которое работает на десятках телефонов от 4.4.2 и выше. Этот код компилируется в Delphi 10.2.3 для API 14 и Delphi 10.3.3 для API 28.
uses
Androidapi.JNI.App,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.Support;
function TMainService.AndroidServiceStartCommand(const Sender: TObject;
const Intent: JIntent; Flags, StartId: Integer): Integer;
var
ExtraData: String;
{$ifdef VER330}
ServiceChannel: JNotificationChannel;
NotificationManager: JNotificationManager;
Obj: JObject;
{$endif}
NewIntent: JIntent;
ncb: JNotificationCompat_Builder;
ntf: JNotification;
PendingIntent: JPendingIntent;
begin
Result := TJService.JavaClass.START_NOT_STICKY;
// can't ref .O on earlier phones, must hardcode
if TJBuild_VERSION.JavaClass.SDK_INT > 26 then // JBuild_VERSION_CODES.JavaClass.O begin
{$ifdef VER330}
// new ways for SDK > 26 (won't be called when API < 26 anyways)
ServiceChannel := TJNotificationChannel.JavaClass.init(
StringtoJString(CHANNEL_ID),
StrToJCharSequence('My Service Channel'),
TJNotificationManager.JavaClass.IMPORTANCE_DEFAULT
);
Obj := TAndroidHelper.Context.getSystemService(
TJContext.JavaClass.NOTIFICATION_SERVICE);
NotificationManager := TJNotificationManager.Wrap(Obj);
NotificationManager.createNotificationChannel(ServiceChannel);
NewIntent:= TAndroidHelper.Context.getPackageManager().getLaunchIntentForPackage(
TAndroidHelper.Context.getPackageName());
NewIntent.setAction(TJIntent.JavaClass.ACTION_MAIN);
NewIntent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER);
NewIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
PendingIntent := TJPendingIntent.JavaClass.getActivity(
TAndroidHelper.Context, 0, NewIntent,
TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK
);
ncb := TJNotificationCompat_Builder.JavaClass.init(
TAndroidHelper.Context,
StringToJString(CHANNEL_ID)
);
ncb.setContentTitle(StrToJCharSequence('MyService'));
// ncb.setTicker(StrToJCharSequence('MyCommsService')); // can't remember why this is commented out to be honest
ncb.setSmallIcon(JavaService.getApplicationInfo.icon);
ncb.setContentIntent(PendingIntent);
ncb.setOngoing(True);
ntf := ncb.build;
{$endif VER330}
end
else
begin
{$ifdef ORDINARY_NOTIFICATION}
PendingIntent := TJPendingIntent.JavaClass.getActivity(
JavaService.getApplicationContext, 0, Intent, 0
);
ntf := TJNotification.Create;
ntf.icon := JavaService.getApplicationInfo.icon;
ntf.setLatestEventInfo(
JavaService.getApplicationContext,
StrToJCharSequence('MyService'),
StrToJCharSequence('MyCommsService'), PendingIntent);
{$endif}
{$ifdef CLICKABLE_NOTIFICATION}
NewIntent:= TAndroidHelper.Context.getPackageManager().getLaunchIntentForPackage(
TAndroidHelper.Context.getPackageName());
NewIntent.setAction(TJIntent.JavaClass.ACTION_MAIN);
NewIntent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER);
NewIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
PendingIntent := TJPendingIntent.JavaClass.getActivity(
TAndroidHelper.Context, 0, NewIntent,
TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK
);
ncb := TJNotificationCompat_Builder.JavaClass.init(TAndroidHelper.Context);
ncb.setContentTitle(StrToJCharSequence('MyService'));
ncb.setTicker(StrToJCharSequence('MyCommsService'));
ncb.setSmallIcon(JavaService.getApplicationInfo.icon);
ncb.setContentIntent(PendingIntent);
ncb.setOngoing(True);
ntf := ncb.build;
{$endif}
end;
JavaService.startForeground(StartId, ntf);
if Intent <> nil then
begin
ExtraData := TAndroidHelper.JStringToString(
Intent.getStringExtra(TAndroidHelper.StringToJString('ExtraData')));
end;
end;