在 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 安卓应用中实现系统通知的功能了。这个功能可以给用户实时的消息推送和提示,可以让用户方便地了解当前应用程序的状态和提醒。