本文整理自网络,侵删。
创建Android服务Android服务是一个没有用户界面的应用程序,它执行后台任务。基本上有两种服务类型:
开启服务:此服务由Android应用程序启动。即使应用程序关闭,服务也可以无限期地在后台运行。这种类型的服务通常执行单个任务,完成后自动停止。绑定服务:此服务仅在绑定到Android应用程序时才运行。应用与服务之间有相互作用,它保持活跃直到应用释放。多个应用程序可以绑定到同一个服务。创建Android服务项目:1、使用New Android Service wizard创建Android服务。请参阅创建Android服务。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文件中,其他应用程序的访问被阻止:"/>远程服务(remote service)是公共的,其他应用程序可以访问它。添加一行代码到Android Manifest文件,访问服务被准许。"/>有关不同选项的更多信息,请参见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中rlibProxyAndroidService.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 DependenciesAndroid服务项目接种到宿主应用程序自动启用的Project Dependencies总是在宿主应用前建立。
从应用程序中删除Android服务在多设备应用程序上,选择Android目标平台。1、在Android目标平台上,右键单击并Remove Android Service。2、出现Remove Android Services wizard向导3、选择要从列表中删除的服务。4、点击Next5、向导显示要执行的操作列表,例如删除数据模块,.so扩展文件和.JAR扩展文件。6、点击Finish启动服务使用ALocalServiceConnection.StartService('<服务名>') and ALocalServiceConnection.BindService('<服务名>'), or ARemoteServiceConnection.StartService('<服务名>') and ARemoteServiceConnection.BindService('<服务名>'),服务开始启动。当启动或绑定时,初始化TLocalServiceConnection变量到一个特定服务,之后你不需要参考服务名称的其他方法。一旦将Android服务添加到多设备应用程序:
在interface接口部分Uses包括下面的单元:
UsesSystem.Android.Service; // 包含与服务一起工作的方法单元。Uses包含 <服务名.pas>单元在implementation。这允许你使用所有的方法定义在数据服务模块。
implementationusesMyLocalService; //Key sensitive{$R *.fmx}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变量。
type TForm1 = class(TForm) ... private { Private declarations } FServiceConnection1: TLocalServiceConnection; // For a local service. FServiceConnection2: TRemoteServiceConnection; // For a remote service. public { Public declarations } end;2、创建TLocalServiceConnection/TRemoteServiceConnection变量:
FServiceConnection1 := TLocalServiceConnection.Create; // For a local service.FServiceConnection2 := TRemoteServiceConnection.Create; // For a remote service.启动服务要启动服务,调用StartService('<服务名>') 开启服务在启动服务后,你需要用JavaService.stopSelf管理服务进程停止服务;
粘性启动(Sticky Start)在服务的OnStartCommand事件被默认限定为START_NOT_STICKY.
START_STICKY用于明确启动和停止需要的服务。系统试图在杀死时重新创建服务。START_NOT_STICKY用于当处理任何命令发送给他们仅保留运行的服务。如果进程被杀死,则服务不会自动重启。如果你想在onStartCommand事件中使用START_STICKY,你需要在服务中说明:
function TService1DM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer;begin Result := TJService.JavaClass.START_STICKY;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
private { Private declarations } [Unsafe] Service1: TAndroidService1DM;更多信息,参阅The Unsafe Attribute.
OnBind事件当你在应用中调用BindService('<服务名>'),在Android服务中触发触发onBind事件。onBind方法返回一个IBinder对象,负责实际管理与服务的连接。
使用onBind方法:
在onBind方法返回IBinder对象:Delphi/Pascal
function TAndroidServiceDM.AndroidServiceBind(const Sender: TObject; const AnIntent: JIntent): JIBinder;begin // .... 你的代码 Result := GetBinder(Self);end;
相关阅读 >>
Delphi实现进制转化(2进制,8进制,10进制,16进制)
Delphi getversionstring 获取文件版本信息
更多相关阅读请进入《Delphi》频道 >>