delphi安卓开发使用系统通知

在 Delphi 安卓开发中,系统通知是一个非常重要的功能,它可以让用户在使用应用程序时及时获得重要的提醒和信息。本文将会介绍 Delphi 安卓开发中使用系统通知的原理和详细操作流程。

一、系统通知的概念与分类

系统通知,就是在 Android 手机的状态栏上显示的提醒信息,包括通知标题、通知内容和通知图标等。通知一般包括两种类型:可清除和不可清除。可清除的通知是指通过用户的手动操作,可以清除掉该通知;而不可清除的通知则需要等到特定条件满足或被处理才能消除。

二、使用原理

通过 Delphi 调用 Android 系统 API,可以实现系统通知的功能。系统通知主要分为两部分:通知栏消息和后台服务。其中通知栏消息是负责在手机通知栏上显示提示信息,而后台服务则需要运行一个 Service 来维护通知的生命周期以及处理后续操作。

三、详细操作流程

以下是 Delphi 安卓开发中使用系统通知的详细操作流程:

1. 添加权限

首先需要在 AndroidManifest.xml 文件中添加以下权限:

```

//震动权限

//开机启动权限

//保持唤醒权限

//辅助功能权限

//通知权限

```

2. 创建 Service

创建一个 Service,用于定时检测并发送通知。代码如下:

```

unit MyService;

interface

uses

System.SysUtils, System.Classes, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,Androidapi.JNI.Os,Androidapi.JNI.App,Androidapi.JNIBridge,Androidapi.JNI.NotificationManagerCompat,Androidapi.JNI.Notification,FMX.Platform.Android;

type

TMyService = class(TAndroidService)

procedure AndroidServiceCreate(Sender: TObject);

procedure AndroidServiceStartCommand(const Sender: TObject;

const Intent: JIntent; Flags, StartId: Integer; var StopService: Boolean);

private

{ Private 宣言 }

public

{ Public 宣言 }

end;

var

MyService: TMyService;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

procedure TMyService.AndroidServiceCreate(Sender: TObject);

begin

// TODO: 繝味Λ繝��繝。繝シ繧ク繝」繝�繝ォ繧貞叙蠕励∈TAndroidService縺ョ譌・莠亥クコ螻樊€�

end;

procedure TMyService.AndroidServiceStartCommand(const Sender: TObject;

const Intent: JIntent; Flags, StartId: Integer; var StopService: Boolean);

var

NotificationManager: JNotificationManager;

Builder: JNotificationCompat_Builder;

Notification: JNotification;

Title, Content: JString;

begin

NotificationManager := TJNotificationManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE));

//创建Notification.Builder

Title := StringToJString('测试Notification');

Content := StringToJString('这个是一条测试Notification消息');

Builder := TJNotificationCompat_Builder.JavaClass.init(TAndroidHelper.Context);

Builder.setSmallIcon(TAndroidHelper.Context.getApplicationInfo().icon);

Builder.setContentTitle(Title);

Builder.setContentText(Content);

Builder.setTicker(Content);

//设置意图

Builder.setContentIntent(nil);

Builder.setAutoCancel(True);

//发声或震动

Builder.setDefaults(TJNotification.JavaClass.DEFAULT_ALL);

//启动通知

Notification := Builder.build();

NotificationManager.notify(0, Notification);

//自毁

StopService := True;

end;

end.

```

3. 创建 BroadcastReceiver

创建一个 BroadcastReceiver 来接收系统通知的操作,代码如下:

```

unit NotificationClickReceiver;

interface

uses

System.SysUtils,System.Types,System.UITypes,System.Classes,Androidapi.JNI.GraphicsContentViewText,

Androidapi.JNI.JavaTypes,Androidapi.JNI.Os,Androidapi.Helpers,Androidapi.JNIBridge,Androidapi.JNI.App,

Androidapi.JNI.NotificationManagerCompat,Androidapi.JNI.Notification,FMX.Platform.Android,

System.Notification;

type

TNotificationClickReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener)

public

procedure onReceive(Context: JContext; Intent: JIntent); cdecl;

end;

var

NotificationClickReceiver: TNotificationClickReceiver;

implementation

procedure TNotificationClickReceiver.onReceive(Context: JContext; Intent: JIntent);

var

NotificationManager: JNotificationManager;

Notification: JNotification;

begin

if not Assigned(NotificationManager) then

NotificationManager := TJNotificationManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE));

if not Assigned(Notification) then

Notification := TJNotification.Wrap((Intent.getParcelableExtra(TJNotification.JClass.EXTRA_NOTIFICATION) as IParcelable).GetObjectID);

NotificationManager.cancel(Notification.contentIntent.requestCode);

end;

end.

```

4. 为 Service 注册 BroadcastReceiver

在 Service 的 AndroidServiceCreate 方法中注册 BroadcastReceiver:

```

procedure TMyService.AndroidServiceCreate(Sender: TObject);

var

LReceiver: JFMXBroadcastReceiver;

begin

inherited;

LReceiver := TJFMXBroadcastReceiver.JavaClass.init;

LReceiver.setListener(NotificationClickReceiver);

LReceiver.addAction(TJNotificationManager.JavaClass.ACTION_NOTIFICATION_CLICKED);

TJLocalBroadcastManager.JavaClass.getInstance(TAndroidHelper.Context).registerReceiver(LReceiver, TJLocalBroadcastFilter.JavaClass.init(TJNotificationManager.JavaClass.ACTION_NOTIFICATION_CLICKED));

end;

```

5. 在主界面中启动 Service

在主界面代码中启动 Service:

```

uses

MyService;

procedure TForm1.Button1Click(Sender: TObject);

begin

TAndroidHelper.Context.StartService(TAndroidHelper.JavaServiceClass(TMyService));

end;

```

6. 发送系统通知

在 Service 中发送系统通知,代码如下:

```

NotificationManager := TJNotificationManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE));

//创建Notification.Builder

Title := StringToJString('测试Notification');

Content := StringToJString('这个是一条测试Notification消息');

Builder := TJNotificationCompat_Builder.JavaClass.init(TAndroidHelper.Context);

Builder.setSmallIcon(TAndroidHelper.Context.getApplicationInfo().icon);

Builder.setContentTitle(Title);

Builder.setContentText(Content);

Builder.setTicker(Content);

//设置意图

Builder.setContentIntent(nil);

Builder.setAutoCancel(True);

//发声或震动

Builder.setDefaults(TJNotification.JavaClass.DEFAULT_ALL);

//启动通知

Notification := Builder.build();

NotificationManager.notify(0, Notification);

```

通过以上步骤,就可以在 Delphi 安卓应用中实现系统通知的功能了。这个功能可以给用户实时的消息推送和提示,可以让用户方便地了解当前应用程序的状态和提醒。

川公网安备 51019002001728号