1

我使用本地 Android 服务TestService2制作了一些测试应用程序TestPro。在 TestPro 中只有一个按钮启动服务。当我单击按钮时,在设置 -> 应用程序 -> 运行中,我可以看到 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

4

1 回答 1

0

您的服务当前是“已启动”服务,因此即使在 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() 启动服务时,服务即被“启动”。一旦启动,服务可以无限期地在后台运行,即使启动它的组件被破坏。通常,启动的服务执行单个操作并且不会将结果返回给调用者。例如,它可能通过网络下载或上传文件。操作完成后,服务应自行停止。

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

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

于 2016-09-15T22:53:24.187 回答