【问题标题】:Android App with Local Service go down (Delphi Berlin)带有本地服务的 Android 应用程序出现故障(Delphi Berlin)
【发布时间】:2016-09-14 08:45:17
【问题描述】:

我使用本地 Android 服务 TestService2 制作了一些测试应用程序 TestPro。在 TestPro 中只有一个按钮启动服务。 当我点击按钮时,在 Settings -> Apps -> RUNNING 我可以看到 1 个进程和 1 个服务。这意味着服务运行正常。 之后我打开另一个应用程序,最好的方法是打开浏览器并开始冲浪(TestPro 变为非活动状态)。一段时间后,系统将终止 TestPro。如果我尝试激活程序,它将尝试启动但没有成功。系统询问等待或强制关闭没有响应的应用程序(LogCat 没有得到“Application.Initialize”)。在第二次开始 - 相同。第三次程序正常启动。 有任何想法吗?
这是应用程序代码:

program TestPro;

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit1 in 'Unit1.pas' {FrmMain},
  Androidapi.Helpers,                                   // TAndroidHelper
  AndroidApi.Log,                                       // LOGI
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.ActivityManager in 'Androidapi.JNI.ActivityManager.pas';

var
  LIntent: JIntent;

{$R *.res}

begin
  LogI('Application.Initialize');  // !!!
  Application.Initialize;
  Application.CreateForm(TFrmMain, FrmMain);
  Application.Run;
end.

在 Unit1.pas 中:

unit Unit1;
...
procedure TFrmMain.StartService();
var
  LIntent: JIntent;
begin
  LIntent := TJIntent.Create;
  LIntent.setClassName(TAndroidHelper.Context.getPackageName(),TAndroidHelper.StringToJString('com.embarcadero.services.TestService2'));
  TAndroidHelper.Activity.startService(LIntent);
end;

procedure TFrmMain.Button1Click(Sender: TObject);
begin
  StartService();
end;

这是服务中的代码:

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
    Result := TJService.JavaClass.START_STICKY;
end;

PS。柏林德尔福,SDK 24.3.3

【问题讨论】:

    标签: android delphi service firemonkey delphi-10.1-berlin


    【解决方案1】:

    您的服务当前是“已启动”服务,因此即使在 TestPro 关闭后它仍会继续运行。然后,当新启动尝试重新启动它时,它仍在运行。使其成为“绑定”服务以避免这种情况:

    Unit1.pas(已更改)

    unit Unit1;
    ...
    procedure TFrmMain.StartService();
    var
     LIntent: JIntent;
    begin
     LIntent := TJIntent.Create;
     LIntent.setClassName(TAndroidHelper.Context.getPackageName(),TAndroidHelper.StringToJString('com.embarcadero.services.TestService2'));
     TAndroidHelper.Activity.BindService(LIntent);
    end;
    
    procedure TFrmMain.Button1Click(Sender: TObject);
    begin
     BindService();
    end;
    


    当您的应用程序执行此操作时,这应该会终止您的服务。
    然后可以在连续启动时重新启动它。

    以下内容来自 Android 开发者网站关于服务:

    服务基本上可以采取两种形式:

    开始
    当应用程序组件(例如活动)时“启动”服务 通过调用 startService() 来启动它。一旦启动,服务就可以在 背景无限期,即使启动它的组件被销毁。 通常,启动的服务执行单个操作并且不返回 结果给调用者。例如,它可能会通过 网络。操作完成后,服务应自行停止。

    绑定
    当应用程序组件通过调用绑定到服务时,服务被“绑定” 绑定服务()。绑定服务提供客户端-服务器接口,允许 组件与服务交互、发送请求、获取结果,甚至 通过进程间通信 (IPC) 跨进程执行此操作。绑定服务 仅当另一个应用程序组件绑定到它时才会运行。多 组件可以一次绑定到服务,但是当所有组件都解除绑定时, 服务被破坏

    来源:https://developer.android.com/guide/components/services.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多