delphi 10 seattle 安卓服务开发(三)

简介: delphi 10 里面的安卓服务有四种,上面的一篇文章里面的图有介绍。 今天做一个remote service 的例子。(里面一部分代码是抄别人的,如果不太清楚,自行恶补)   remote service 实际上就是主程序包含服务模块,另外的一个程序可以调用。

delphi 10 里面的安卓服务有四种,上面的一篇文章里面的图有介绍。

今天做一个remote service 的例子。(里面一部分代码是抄别人的,如果不太清楚,自行恶补)

 

remote service 实际上就是主程序包含服务模块,另外的一个程序可以调用。

由于delphi 10 的低级错误,需要手工修改一些东西。这一块可以参考http://blog.qdac.cc/?p=2839

为了不影响这个例子的顺利完成,本例中没有使用上面的修改。直接在本例中处理。

现在开工:

和以前一样,先建立一个远程服务

生成文件,保存目录。

打开servicedmp
 

输入以下代码

uses
  Androidapi.Helpers;

function TAndroidServiceDM.AndroidServiceHandleMessage(const Sender: TObject;
  const AMessage: JMessage): Boolean;
const
  GET_STRING = 1234;
  SERVICE_STRING = 4321;

var
  LMessage: JMessage;
  LBundle: JBundle;
begin
  case AMessage.what of
    GET_STRING:
    begin
      LBundle := TJBundle.Create;  // we can not send String because is not parcelable
      LMessage := TJMessage.Create;
      LMessage.what := SERVICE_STRING;

      LBundle.putString(TAndroidHelper.StringToJString('Key'), TAndroidHelper.StringToJString('这是服务来的消息!!!'));
      LMessage.obj := LBundle;
      AMessage.replyTo.send(LMessage);
      Result := True;
    end;
  else
    Result := False;
  end;

end;

ok ,开始编译,出现错误,当然了。EMB 同志犯了低级错误。

进入手动模式,打开下面文件:

修改

现在编译,没问题了,好,保存。

现在我们建立一个新的工程,用来加入这个服务,并使用这个服务,界面如下:

注意获取数据的按钮的enabled:=False;

代码如下

unit mainp;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation,System.Android.Service, Androidapi.JNI.Os;

type
  TForm3 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    GetDataButton: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure GetDataButtonClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FServiceConnection: TRemoteServiceConnection;
     procedure OnServiceConnected(const ServiceMessenger: JMessenger);
    procedure OnHandleMessage(const AMessage: JMessage);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;
const
  GET_STRING = 1234;
  SERVICE_STRING = 4321;

implementation

{$R *.fmx}
uses
  AndroidApi.Helpers,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Widget;

procedure TForm3.Button1Click(Sender: TObject);
begin
   // 绑定服务
   FServiceConnection.BindService(
    // 包含服务的 APK 名称
    'com.embarcadero.xalionhostapp',
    // 服务名- 总是以 "com.embarcadero.services"开头
    'com.embarcadero.services.xalionremoteservice');
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  // 取消绑定
   if FServiceConnection <> nil then
    FServiceConnection.UnbindService;
  GetDataButton.Enabled := False;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  // 初始化服务连接
  FServiceConnection := TRemoteServiceConnection.Create;
  FServiceConnection.OnConnected := OnServiceConnected;
  FServiceConnection.OnHandleMessage := OnHandleMessage;
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
   FServiceConnection.Free;
end;

procedure TForm3.GetDataButtonClick(Sender: TObject);
var
  LMessage: JMessage;
begin
  LMessage := TJMessage.JavaClass.obtain(nil, GET_STRING);
  LMessage.replyTo := FServiceConnection.LocalMessenger;
  FServiceConnection.ServiceMessenger.send(LMessage);

end;

procedure TForm3.OnHandleMessage(const AMessage: JMessage);
var
  LStr: JString;
  LBundle: JBundle;
begin
  case AMessage.what of
    SERVICE_STRING:
    begin
      LBundle := TJBundle.Wrap(AMessage.obj);
      LStr := LBundle.getString(TAndroidHelper.StringToJString('Key'));
      TJToast.JavaClass.makeText(TAndroidHelper.Context, LStr.subSequence(0, LStr.length),
        TJToast.JavaClass.LENGTH_SHORT).show;
    end;
  else
    FServiceConnection.Handler.Super.handleMessage(AMessage);
  end;

end;

procedure TForm3.OnServiceConnected(const ServiceMessenger: JMessenger);
begin
      GetDataButton.Enabled := True;
end;

end.

现在把刚才建立的服务加进去

编译运行。

是不是可以正常运行了?

先点一下绑定服务,等获取数据可以点时,点一下,就可以取到服务发来的消息了。

 

OK,这只是实现了内部的通讯,我们还需要另外做一个app. 让它也可以使用这个服务。

重新建立一个新的APP.

界面如下:

代码与主程序非常相似

unit mainp;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation,System.Android.Service, Androidapi.JNI.Os;

type
  TForm3 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    GetDataButton: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure GetDataButtonClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FServiceConnection: TRemoteServiceConnection;
     procedure OnServiceConnected(const ServiceMessenger: JMessenger);
    procedure OnHandleMessage(const AMessage: JMessage);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;
const
  GET_STRING = 1234;
  SERVICE_STRING = 4321;

implementation

{$R *.fmx}
uses
  AndroidApi.Helpers,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Widget;

procedure TForm3.Button1Click(Sender: TObject);
begin
   // 绑定服务
   FServiceConnection.BindService(
    // 包含服务的 APK 名称
    'com.embarcadero.xalionhostapp',
    // 服务名- 总是以 "com.embarcadero.services"开头
    'com.embarcadero.services.xalionremoteservice');
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  // 取消绑定
   if FServiceConnection <> nil then
    FServiceConnection.UnbindService;
  GetDataButton.Enabled := False;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  // 初始化服务连接
  FServiceConnection := TRemoteServiceConnection.Create;
  FServiceConnection.OnConnected := OnServiceConnected;
  FServiceConnection.OnHandleMessage := OnHandleMessage;
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
   FServiceConnection.Free;
end;

procedure TForm3.GetDataButtonClick(Sender: TObject);
var
  LMessage: JMessage;
begin
  LMessage := TJMessage.JavaClass.obtain(nil, GET_STRING);
  LMessage.replyTo := FServiceConnection.LocalMessenger;
  FServiceConnection.ServiceMessenger.send(LMessage);

end;

procedure TForm3.OnHandleMessage(const AMessage: JMessage);
var
  LStr: JString;
  LBundle: JBundle;
begin
  case AMessage.what of
    SERVICE_STRING:
    begin
      LBundle := TJBundle.Wrap(AMessage.obj);
      LStr := LBundle.getString(TAndroidHelper.StringToJString('Key'));
      TJToast.JavaClass.makeText(TAndroidHelper.Context, LStr.subSequence(0, LStr.length),
        TJToast.JavaClass.LENGTH_SHORT).show;
    end;
  else
    FServiceConnection.Handler.Super.handleMessage(AMessage);
  end;

end;

procedure TForm3.OnServiceConnected(const ServiceMessenger: JMessenger);
begin
      GetDataButton.Enabled := True;
end;

end.

 

编译,运行。
点绑定服务,奇怪了,怎么获取数据不出来,反而出现了“程序无反应” 是否关闭?

唉。又是 EMB 同志的低级错误。

手动模式,打开主程序的目录。

打开这个文件

把这个替换成

<service android:exported="true" android:name="com.embarcadero.services.xalionremoteservice" />

如图

 

重新编译运行主程序。

现在再运行扩展程序。怎么样,ok了?

 

 

 

 

 

 

 

目录
相关文章
|
8天前
|
存储 安全 Android开发
安卓应用开发:构建一个高效的用户登录系统
【5月更文挑战第3天】在移动应用开发中,用户登录系统的设计与实现是至关重要的一环。对于安卓平台而言,一个高效、安全且用户体验友好的登录系统能够显著提升应用的用户留存率和市场竞争力。本文将探讨在安卓平台上实现用户登录系统的最佳实践,包括对最新身份验证技术的应用、安全性考量以及性能优化策略。
|
2天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
8 0
|
3天前
|
Android开发 Kotlin
Kotlin开发Android之基础问题记录
Kotlin开发Android之基础问题记录
15 1
|
3天前
|
Java Android开发
Android开发@IntDef完美替代Enum
Android开发@IntDef完美替代Enum
12 0
|
4天前
|
Android开发
Android 盒子开发过程中遇到的问题及解决方法
Android 盒子开发过程中遇到的问题及解决方法
8 2
|
5天前
|
机器学习/深度学习 算法 Android开发
安卓应用开发:打造高效通知管理系统
【5月更文挑战第6天】 在现代移动应用的海洋中,用户经常面临信息过载的挑战。一个精心设计的通知管理系统对于提升用户体验至关重要。本文将探讨在安卓平台上如何实现一个高效的通知管理系统,包括最佳实践、系统架构设计以及性能优化技巧。通过分析安卓通知渠道和优先级设置,我们的目标是帮助开发者构建出既能吸引用户注意,又不会引发干扰的智能通知系统。
16 2
|
5天前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
存储 缓存 Android开发
|
XML Java 程序员
Android开发:获取安卓App版本号的方法步骤
在Android开发过程中,想要开发一个完整功能的App,各个地方的内容都要涉及到,比如获取App的系统版本号就是必须要有的功能。Android的App版本号相关内容比iOS的App版本号内容要多,而且iOS版的App版本信息跟Android的还不一样。本篇文章就来介绍一下Android开发中获取App版本号的方法步骤,方便以后使用。获取App版本号常用的有两个方法,这两种方式都能获取到系统版本号,请根据实际需求或者偏好来选择任何一种方法即可。
1040 0
Android开发:获取安卓App版本号的方法步骤
|
Java API 开发工具