1

ローカル Android サービスTestService2を使用して、いくつかのテスト アプリケーションTestProを作成しました。TestPro では、サービスを開始するボタンは 1 つだけです。ボタンをクリックすると、[設定] -> [アプリ] -> [実行中] に1 つのプロセスと 1 つのサービスが表示されます。それはサービスが正常に実行されていることを意味します。その後、別のアプリケーションを開きます。最良の方法は、ブラウザーを開いてサーフィンを開始することです (TestPro が非アクティブになりました)。しばらくすると、システムは TestPro を強制終了します。プログラムをアクティブにしようとすると、成功せずに起動しようとします。システムは待機するか、応答していないアプリを強制的に閉じます ( LogCat は "Application.Initialize" を取得しません)。2回目の開始時 - 同じ。3回目にプログラムが正常に起動します。何か案は? アプリケーションコードは次のとおりです。

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。Delphi ベルリン、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 開発者の Web サイトからのものです。

サービスは基本的に次の 2 つの形式を取ることができます。

開始
済み サービスは、アプリケーション コンポーネント (アクティビティなど) が startService() を呼び出してサービスを開始したときに「開始」されます。開始されたサービスは、それを開始したコンポーネントが破棄された場合でも、無期限にバックグラウンドで実行できます。通常、開始されたサービスは単一の操作を実行し、呼び出し元に結果を返しません。たとえば、ネットワーク経由でファイルをダウンロードまたはアップロードする場合があります。操作が完了すると、サービスは自動的に停止します。

バインド
サービスは、アプリケーション コンポーネントが bindService() を呼び出してサービスにバインドするときに「バインド」されます。バインドされたサービスは、コンポーネントがサービスとやり取りしたり、要求を送信したり、結果を取得したり、プロセス間通信 (IPC) を使用してプロセス全体でそれらを実行したりできるようにするクライアント サーバー インターフェイスを提供します。バインドされたサービスは、別のアプリケーション コンポーネントがバインドされている間だけ実行されます。一度に複数のコンポーネントをサービスにバインドできますが、すべてのコンポーネントがバインド解除されると、 サービスは破棄されます。

ソース: https://developer.android.com/guide/components/services.html

于 2016-09-15T22:53:24.187 に答える