Android 如何在Delphi中使用后台服务自动运行应用程序?
是否有可能在Delphi 10中创建一个android应用程序(带有后台服务),在启动android设备后自动启动 我找到了一个解决方案(),但它适用于Delphi XE5版本,并且没有自动启动后台服务的选项 你们有人试图解决这个问题吗?如果是,请与我们分享您的解决方案 更新: 我不知道怎么了。Android 如何在Delphi中使用后台服务自动运行应用程序?,android,delphi,service,autorun,delphi-10-seattle,Android,Delphi,Service,Autorun,Delphi 10 Seattle,是否有可能在Delphi 10中创建一个android应用程序(带有后台服务),在启动android设备后自动启动 我找到了一个解决方案(),但它适用于Delphi XE5版本,并且没有自动启动后台服务的选项 你们有人试图解决这个问题吗?如果是,请与我们分享您的解决方案 更新: 我不知道怎么了。 将广播接收器添加到使用中 注册广播接收机 procedure TForm1.CreateBroadcastReceiver; begin if not Assigned(BroadcastRecei
procedure TForm1.CreateBroadcastReceiver;
begin
if not Assigned(BroadcastReceiver) then
begin
BroadcastReceiver:= TCSBroadcastReceiver.Create(nil);
BroadcastReceiver.OnReceive:= BroadcastReceiverOnReceive;
BroadcastReceiver.RegisterReceive;
BroadcastReceiver.Add('android.intent.action.BOOT_COMPLETED');
end;
end;
procedure TForm1.BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent);
var
Inx: JIntent;
begin
if JStringToString(csIntent.getAction).Contains('android.intent.action.BOOT_COMPLETED') then
begin
Inx := TJIntent.Create;
Inx.setClassName(csContext, StringToJString('com.embarcadero.firemonkey.FMXNativeActivity'));
Inx.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
TAndroidHelper.Context.startActivity(Inx);
end;
end;
接收\u引导\u完成
权限我做错了什么。什么是错误?在活动/组件明确请求Android服务开始运行之前,它不会开始运行。您仍然需要创建并注册一个
BroadcastReceiver
,以接收BOOT\u COMPLETED
事件(如所述),并让事件处理程序根据需要启动服务:
您可以将DanyWind的BroadcastReceiver更改为启动服务,而不是应用程序(主机):
package com.dannywind.delphi;
导入android.app.Activity;
导入android.content.BroadcastReceiver;
导入android.content.Intent;
导入android.content.Context;
公共类BootReceiver扩展了BroadcastReceiver
{
@凌驾
公共void onReceive(上下文、意图)
{
意向启动意向=新意向();
launchintent.setClassName(上下文,“com.embarcadero.services.MyLocationService”);
启动服务(launchintent);
}
}
您还需要更新build.bat中的所有XE5路径,以指向D10或更高版本的等效路径
Danny的build.bat将BootReceiver.dex与默认的Embaracdero Classes.dex合并,而不是使用应用程序(主机)生成的Classes.dex。必须更正批处理文件中的路径。请参阅我的答案以获得更详细的描述。我在上周的工作中成功地解决了这个问题,使用Delphi Tokyo 10.2自动启动了一个应用程序。我目前正在考虑启动后台服务,而不是启动后的应用程序,因为闪屏和应用程序在每次设备启动时都会“弹出”。(我只是在研究如何启动服务时偶然发现了你的问题,本周末我将尝试建议的“startService”Java方法的一种变体。经历了痛苦之后,我可以减轻你的痛苦。) 基本上,对于较新的编译器,您不再需要Danny Wind文章中修改“Classes.dex”文件的步骤。我下面所描述的对东京有效,如果它以同样的方式工作,可能对西雅图也有效,我相信它确实如此 您不能使用Delphi代码注册BroadcastReceiver。这必须在Java中完成,编译的类位于JAR中。Danny Wind的Java包将继续完全按照这一技巧进行操作,条件是在清单文件中包含问题的第4步,在项目的Android权限中包含问题的第5步 顺便说一句,您不应该编辑“AndroidManifest.xml”文件,而应该编辑“AndroidManifest.template.xml”文件 如果您了解如何为后台服务添加JAR,那么您可以按照相同的方法添加包含BroadcastReceiver的JAR,以便“BOOT_COMPLETED”,方法是转到“Android”目标平台下的“Libraries”文件夹,右键单击并选择“add”。在本例中,不是添加后台服务JAR(应该已经存在),而是添加包含BroadcastReceiver的JAR 为了将Java编译成一个类,然后将其包含在一个JAR中,我使用以下批处理文件,它基于Danny Wind的文章和Delphi运行的命令来编译它为后台服务生成的Java(您可以在Messages窗口的Output选项卡中看到): 批处理文件采用3个参数:
@ECHO OFF
rem Path to Android classes JAR-file
SET ANDROID_JAR="C:\Users\Public\Documents\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows\platforms\android-26\android.jar"
rem Setup parameters
SET SOURCE_FILE=%1
SET JAR_FILE=%2
IF x%2 == x SET JAR_FILE=%SOURCE_FILE%
SET CONFIGURATION=%3
IF x%3 == x SET CONFIGURATION=Debug
rem Ensure directory to hold Java Class files exists for Java Archive
MKDIR JavaClasses\%JAR_FILE% 2> NUL
rem Indicate actions
ECHO .
ECHO Compiling %SOURCE_FILE%.java to %SOURCE_FILE%.class and storing in %CONFIGURATION%\%JAR_FILE%.jar...
ECHO .
rem Compile Java Class file
"%JAVASDK%\javac" -Xlint:deprecation -classpath %ANDROID_JAR% -bootclasspath %ANDROID_JAR% -d JavaClasses\%JAR_FILE% -target 1.6 -g -source 1.6 %SOURCE_FILE%.java
rem Create Java Archive file containing class file
"%JAVASDK%\jar" cf %CONFIGURATION%\%JAR_FILE%.jar -C .\JavaClasses\%JAR_FILE% com
rem Clean-up
SET ANDROID_JAR=""
SET SOURCE_FILE=""
SET JAR_FILE=""
SET CONFIGURATION=""