Android 如何在Delphi中使用后台服务自动运行应用程序?

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

是否有可能在Delphi 10中创建一个android应用程序(带有后台服务),在启动android设备后自动启动

我找到了一个解决方案(),但它适用于Delphi XE5版本,并且没有自动启动后台服务的选项

你们有人试图解决这个问题吗?如果是,请与我们分享您的解决方案

更新:

我不知道怎么了。

  • 将广播接收器添加到使用中

  • 注册广播接收机

    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;
    
  • 设置广播接收机OnReceive

    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;
    
  • 更新AndroidManifest.xml

  • 
    
  • 启用了
    接收\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个参数:

  • Java文件的名称,减去任何扩展名
  • JAR文件的名称,减去任何扩展名
  • 配置名称(即“调试”或“发布”)
  • 如果只有一个参数,JAR文件名将与Java文件名相同,配置将设置为“Debug”

    如果只有两个参数,配置将设置为“调试”

    请注意,批处理文件目前不会对参数执行任何错误检查

    批处理文件在调用“javac”时使用的参数与Danny Wind的文章中使用的参数略有不同。我从DelphiIDE使用的内容中获取了这些内容(如Output选项卡中所示)

    您需要更改设置环境变量“ANDROID_JAR”的行,以获得编译器“ANDROID.JAR”文件的正确路径

    您还需要将名为“JAVASDK”的环境变量设置为JAVASDK的“bin”文件夹的路径。在我的机器上是“C:\Program Files\Java\jdk1.8.0\U 60\bin”。这是我通过“系统属性/高级/环境变量”设置的

    编译和归档后,包含BroadcastReceiver的JAR将位于“Debug”或“Release”文件夹中,具体取决于您选择的配置

    将包含BroadcastReceiver的JAR添加到您的项目中后,较新版本的Delphi将自动将JAR文件链接到“Classes.dex”中,并最终链接到应用程序的APK中

    将APK部署到您的设备上,至少运行一次应用程序,然后
    @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=""