2016-09-14 5 views
1

テストアプリケーションTestProローカルAndroidサービスTestService2でテストアプリケーションを作成しました。 TestProでは、サービスを開始するボタンは1つだけです。 ボタンをクリックすると、の設定 - >アプリ - >実行中私は1つのプロセスと1つのサービスを見ることができます。サービスが正常に実行されていることを意味します。 その後、私は別のアプリケーションを開いて、最善の方法は開いているブラウザとサーフィンを開始(TestProは非アクティブになった)。しばらくすると、システムはTestProを殺します。私がプログラムをアクティブにしようとすると、それは成功なしで開始しようとします。システムは、応答していないアプリケーションを待機または強制終了するよう依頼します(LogCatは "Application.Initialize"を取得しません)。 2回目のスタート - 同じ。 3回目には、プログラムは正常に開始されます。 アイデアここで
アプリケーションのコードです:Unit1.pasでローカルサービスのあるAndroidアプリ(デルファイベルリン)

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. 

:ここ

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 Berlin、SDK 24.3.3

答えて

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; 


これはあなたのサービスを終了する必要があります(変更)。
その後、連続して起動して再起動できます。サービスは基本的に2つの形態をとることができ

次は、サービスに関してはAndroidデベロッパーのウェブサイトからあるサービスが「開始」され


を起動したときにアプリケーションコンポーネント(たとえば、アクティビティとして) startService()を呼び出して起動します。開始されたサービスは、開始したコンポーネントが破損したとしても、の場合でも、 バックグラウンドで無期限にのサービスを実行できます。 通常、開始されたサービスは1回の操作を実行し、呼び出し元に 結果を返しません。たとえば、 ネットワークを介してファイルをダウンロードまたはアップロードすることができます。操作が完了すると、サービスは停止する必要があります。

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

出典:https://developer.android.com/guide/components/services.html

関連する問題