RAD Studio Delphi创建安卓服务Creating Android Services


创建Android服务


Android服务是一个没有用户界面的应用程序,它执行后台任务。基本上有两种服务类型:

  • 开启服务:此服务由Android应用程序启动。即使应用程序关闭,服务也可以无限期地在后台运行。这种类型的服务通常执行单个任务,完成后自动停止。
  • 绑定服务:此服务仅在绑定到Android应用程序时才运行。应用与服务之间有相互作用,它保持活跃直到应用释放。多个应用程序可以绑定到同一个服务。

创建Android服务项目:

    • 1、使用New Android Service wizard创建Android服务。请参阅创建Android服务。

<li/2、使用Add New Android Service wizard将Android服务添加到Multi-Device Application。请参阅将Android服务添加到应用程序。

独立应用程序和Android服务项目应用程序之间存在一些差异

  • Target Platform (Android)没有以下结点:Target, Configuration and Libraries.
  • 只有Android才可以作为目标平台(target platform)。
  • Deployment Manager已禁用
  • Run and Run Without Debugging选项被禁用

创建一个安卓服务
RAD Studio提供了一个向导来创建Android服务项目。
要创建一个新的Android服务项目,选择File > New > Other然后导航到:

  • Delphi Projects > Android Service

使用此向导指定服务类型,本地或远程(local or remote)。

  • 本地服务(local service)对应用程序是私有的。添加一行代码Android Manifest文件中,其他应用程序的访问被阻止:
<service android:exported="false" android:name="com.embarcadero.services.<service_name>"/>
  • 远程服务(remote service)是公共的,其他应用程序可以访问它。添加一行代码到Android Manifest文件,访问服务被准许。
<service android:exported="true" android:name="com.embarcadero.services.<service_name>"/>

有关不同选项的更多信息,请参见Android服务。

有关 Android Manifest属性的更多信息,请参见Exported Provider Element。

向应用程序添加安卓服务
Android服务不是独立的应用程序,它们与Multi-Device applications一起工作。
服务一旦被创建,它作为库出现在Project Manager.so。
将Android服务项目添加到多设备应用程序 Multi-Device application:

  • 1、将所有可视化组件、functions和procedures代码添加到data module。
  • 2、保存Android服务项目。
    • 注1:在一个专门的文件夹中保存每个Android服务项目。
    • 注2:不要将Android服务项目命名为Service。
  • 3、在将其添加到应用程序以生成二进制文件之前构建Android服务项目。
  • 4、将要添加服务的应用程序添加到Project Manager:
    • 1.对于已存在的应用程序,在project group中,右键单击并选择Add Existing Project。
    • 2.对于一个新的多设备应用 Multi-Device Application,在project group中,右键单击并选择Add New Project,然后导航到:
      • Delphi Projects > Multi-Device Application.
  • 5、在多设备应用Multi-Device Application上,选择Android目标平台(Android target platform)。
    • 1.在Android目标平台上,右键单击并选择Add Android Service。
    • 2.添加新的安卓服务向导(Add New Android Service wizard)出现。您有两个选项可以添加一个新的安卓服务。选择下列之一:
      • 1.从项目基路径自动搜索文件。(Search files automatically from project base path.)
        • 选择此选项可选择保存您的Android服务项目的文件夹。向导将自动搜索所需的文件。
          警告:如果你在给定的文件夹不止一个安卓服务,向导将随机选择其中一个。如果要添加特定的Android服务,请使用第二个选项。
        • 点击Next.
        • 点击...选择已保存Android服务项目的文件夹。
      • 2.我想手动选择所有想要的文件。(I will select all required files manually.)
        • 选择此选项以手动选择所需的所有文件。
          警告:请确保步骤3已完成。否则,您将没有可用的二进制文件。
        • 点击Next.
        • 单击…选择每个所需要的文件。
      • 3.点击Next.
        • 1.如果所有操作都是正确的,那么将要添加到多设备应用程序的文件就会出现在列表中。
        • 2.如果出现一个额外的窗口请求有关Android服务路径的信息,请保存并构建Android服务,然后再试一次。
  • 单击“Finish”将文件添加到应用程序中:
    • 主要的二进制文件, lib.so二进制文件被添加到部署管理器Deployment Manage中r
    • libProxyAndroidService.so文件。这个库被添加到Deployment Manager中.
      注意:此文件由添加到应用程序的所有服务共享。
    • Java 归档文件(Java archive)<项目名>.jar。jar文件被添加到Android target platform的Project Manager的Libraries结点下。
    • 数据模块文件,<项目名>.pas文件被添加到Project Manager.
  • 7、编译Multi-Device Application以生成Android Manifest文件。与先前选择的服务类型(本地或远程local or remote)相对应的行将自动添加。请参阅创建Android服务。
    注:每个服务需要在AndroidManifest.xml相应的声明。这是由IDE自动添加的。

向应用程序添加几个Android服务


您可以向Android应用程序添加任意数量的服务。
按照添加一个Android服务到应用的步骤为每个服务添加。
考虑到的重要事情:

  • 如果在同一个文件夹中有几个Android服务项目,并且希望包含一个特定的项目,请在步骤5.2中选择第二个选项。否则,向导可能会添加不需要的Android服务。
  • 在添加服务到主应用前,为每个项目命名不同的名称:
    • 安卓服务项目, lib<服务名>.so.
      注:不要将Android服务项目命名为Service。
    • 单元文件。
    • 数据模块,通过更改对象检查器(Object Inspector)上的name属性。

项目依赖项Project Dependencies
安卓服务项目添加到多设备应用出现在Project Dependencies
Android服务项目接种到宿主应用程序自动启用的Project Dependencies总是在宿主应用前建立。
从应用程序中删除Android服务


    在多设备应用程序上,选择Android目标平台。

  • 1、在Android目标平台上,右键单击并Remove Android Service。
  • 2、出现Remove Android Services wizard向导
  • 3、选择要从列表中删除的服务。
  • 4、点击Next
  • 5、向导显示要执行的操作列表,例如删除数据模块,.so扩展文件和.JAR扩展文件。
  • 6、点击Finish

启动服务


使用ALocalServiceConnection.StartService('<服务名>') and ALocalServiceConnection.BindService('<服务名>'), or ARemoteServiceConnection.StartService('<服务名>') and ARemoteServiceConnection.BindService('<服务名>'),服务开始启动。
当启动或绑定时,初始化TLocalServiceConnection变量到一个特定服务,之后你不需要参考服务名称的其他方法。
一旦将Android服务添加到多设备应用程序:

  • 1、在interface接口部分Uses包括下面的单元:
    1. Uses
    2. System.Android.Service; // 包含与服务一起工作的方法单元。
  • 2、Uses包含 <服务名.pas>单元在implementation。这允许你使用所有的方法定义在数据服务模块。
    1. implementationuses
    2. MyLocalService; //Key sensitive
    3. {$R *.fmx}
  • 3、Construct a TLocalServiceConnetion variable for a local service, or a TRemoteServiceConnection variable for a remote service.
    构建一个TLocalServiceConnetion变量为本地服务(local service),或一个TRemoteServiceConnection变量为远程服务(remote service)。

    • 1、声明TLocalServiceConnection/TRemoteServiceConnection变量。
      1. type
      2.   TForm1 = class(TForm)
      3.     ...
      4.   private
      5.     { Private declarations }
      6.     FServiceConnection1: TLocalServiceConnection; // For a local service.
      7.     FServiceConnection2: TRemoteServiceConnection; // For a remote service.
      8.   public
      9.     { Public declarations }
      10.   end;
    • 创建TLocalServiceConnection/TRemoteServiceConnection变量:
      1. FServiceConnection1 := TLocalServiceConnection.Create; // For a local service.
      2. FServiceConnection2 := TRemoteServiceConnection.Create; // For a remote service.

启动服务
要启动服务,调用StartService('<服务名>') 开启服务
在启动服务后,你需要用JavaService.stopSelf管理服务进程停止服务;
粘性启动(Sticky Start)
在服务的OnStartCommand事件被默认限定为START_NOT_STICKY.

  • START_STICKY用于明确启动和停止需要的服务。系统试图在杀死时重新创建服务。
  • START_NOT_STICKY用于当处理任何命令发送给他们仅保留运行的服务。如果进程被杀死,则服务不会自动重启。

如果你想在onStartCommand事件中使用START_STICKY,你需要在服务中说明:

  1. function TService1DM.AndroidServiceStartCommand(const Sender: TObject;
  2.   const Intent: JIntent; Flags, StartId: Integer): Integer;
  3. begin
  4.   Result := TJService.JavaClass.START_STICKY;
  5. end;

更多信息, 参阅Service Lifecycle.
绑定服务(Bound Service)
对于 Bound Service ,调用 BindService('<服务名>')绑定到服务,使用UnBindService来断开服务
更多信息, 参阅 Bound Services.
BindService / UnBindService方法
当主程序调用BindService('<服务名>'),连接变量得到正在运行服务的内存地址指针
在建立一个特定服务连接后,当调用UnBindService并且这个应用是唯一一个绑定到服务的应用时,这个服务自己释放。考虑到主应用程序的连接变量仍然指向同一个内存地址。再次绑定到同一个服务可能会导致主应用程序崩溃,因为服务的内存地址可能无效。
处理这种情况有两种方法:

  • 避免ARC(Automatic Reference Counting)使用[UnSafe]属性
  • 在从服务解绑前指定Nil到变量

Using the [Unsafe] Attribute

  1. private
  2.     { Private declarations }
  3.     [Unsafe] Service1: TAndroidService1DM;

更多信息,参阅The Unsafe Attribute.
OnBind事件

当你在应用中调用BindService('<服务名>'),在Android服务中触发触发onBind事件。onBind方法返回一个IBinder对象,负责实际管理与服务的连接。

使用onBind方法:

    • 在onBind方法返回IBinder对象:
  1. function TAndroidServiceDM.AndroidServiceBind(const Sender: TObject;
  2.   const AnIntent: JIntent): JIBinder;
  3. begin
  4.   // .... 你的代码
  5.   Result := GetBinder(Self);
  6. end;

参阅


» 本文链接:http://www.soguifan.com/delphi/app/1523.html
» 订阅本站:http://www.soguifan.com/feed
» 转载请注明来源:搜规范 » 《RAD Studio Delphi创建安卓服务Creating Android Services》

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixin    pay_weixin
金额随意 快来“打”我呀~




留言