2016-11-19 26 views
-3

私のコードで何が問題なのか分かりません!アプリを閉じるとAndroidサービスが動作しない

私はアプリを閉じると機能しません。もう一度アプリケーションを起動するとカウンタが再起動します。任意のヘルプ マイコード:

メイン:

unit Unit1; 

interface 

uses 
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.IOUtils, 
System.Android.Service, FMX.ScrollBox, FMX.Memo, FMX.Controls.Presentation, 
FMX.StdCtrls 
; 

type 
TForm1 = class(TForm) 
Button1: TButton; 
Memo1: TMemo; 
Button2: TButton; 
procedure Button1Click(Sender: TObject); 
procedure Button2Click(Sender: TObject); 
private 
{ Private declarations } 
FService : TLocalServiceConnection; 
public 
{ Public declarations } 
end; 

var 
    Form1: TForm1; 

implementation 

    {$R *.fmx} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 

FService := TLocalServiceConnection.Create; 

    end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    FService.StartService('AndroidServer'); 


    end; 

    end. 

サービス:

unit Unit2; 

    interface 

     uses 
    System.SysUtils, System.Threading, 
    System.Classes, System.IOUtils, 
    System.Android.Service, 
     AndroidApi.JNI.GraphicsContentViewText, 
    Androidapi.JNI.Os, System.Notification; 

    type 

     TAndroidServiceDM = class(TAndroidService) 
     NotificationCenter1: TNotificationCenter; 
     function AndroidServiceStartCommand(const Sender: TObject; 
     const Intent: JIntent; Flags, StartId: Integer): Integer; 
     procedure AndroidServiceCreate(Sender: TObject); 
     Procedure DoNotification; 
      procedure AndroidServiceTaskRemoved(const Sender: TObject; 
       const ARootIntent: JIntent); 
      procedure AndroidServiceDestroy(Sender: TObject); 
     private 
     { Private declarations } 

     public 
     { Public declarations } 

     end; 

     var 
     AndroidServiceDM: TAndroidServiceDM; 

     io:Integer; 
     implementation 

     {%CLASSGROUP 'FMX.Controls.TControl'} 

      {$R *.dfm} 
      uses 
      Androidapi.JNI.App; 

      procedure TAndroidServiceDM.DoNotification; 
      Var 

     MyNotification: TNotification; 



    begin 


    TTask.Run(procedure 
     begin 

    myNotification := NotificationCenter1.CreateNotification; 
     try 
    MyNotification.Name := 'ServiceNotification'; 
    MyNotification.Title := 'Android Service Notification'; 
    MyNotification.AlertBody := io.ToString; 
    MyNotification.FireDate := Now; 
    NotificationCenter1.PresentNotification(MyNotification); 
    finally 
    myNotification.DisposeOf; 
    end; 

    tthread.Synchronize(nil, 
    procedure 
    begin 
    end); 
    end 
    ) ; 

    end; 

    procedure TAndroidServiceDM.AndroidServiceCreate(Sender: TObject); 
     var 
     atask : Itask; 

     begin 
     io:=1; 
     atask := Ttask.create(procedure() 

     begin 

     while true do 
     begin 

     begin 
     sleep(5000); 
     DoNotification; 
     io:=io+1; 
     end; 

     end; 

end); 

atask.Start; 




    end; 

    procedure TAndroidServiceDM.AndroidServiceDestroy(Sender: TObject); 
    begin 

    end; 

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

     end; 



    end. 

それが仕事だが、私はアプリを閉じたときにサービスが動作しません! カウンタを再起動するとアプリが再起動します。 任意のヘルプ

おかげ

+0

にサービス追加を挿入します。 Delphi 10 SeattleとDelphi 10.1 Berlinがありますが、いずれもXE10ではありません。 –

+0

Delphi 10 Seattle and Delphi 10.1 Berlin –

答えて

2

ローカルサービスは、それを起動するアプリと同じプロセスで実行されます。アプリが終了すると、サービスも終了します。

ホストアプリケーションの寿命を延ばすサービスが必要な場合は、メインスレッドではなくホストアプリケーションのワーカースレッドでサービスを開始し、サービスのonStartCommandイベントでService.startForeground()メソッドを呼び出します。

また、マニフェストでローカルではなくリモートとしてサービスをマークする必要があるため、サービスは独自のプロセスで実行されます。メインアプリは、インテントなど、必要に応じてサービスと通信できます。

+0

@IsamBukインターネットには多くの例があります。この幅広いプロジェクトに必要なそれぞれの具体的なタスクに関するチュートリアルもたくさんあります。あなたのためにあなたのプロジェクトを書くためにここに私たちの誰もが期待しないでください。 –

+0

ありがとうございましたリンクの例を教えていただけますか? Delphi 10.1で動作しましたBerlin –

+0

startForegroundは 'JNotification'を受け取りますが、' TNotification'から 'JNotification'を得る方法がわかりません。 – nurettin

1
  1. ここAlarmManager

によってRemote

  • スタートサービスなどのサービスを作成し、サービスを開始し、すぐに自分自身をオフにアプリケーションのコードです。

    program PlayerPowerMgr; 
    
    uses 
        AndroidApi.JNI.GraphicsContentViewText, 
        Androidapi.Helpers, 
        Androidapi.JNI.App, 
    
        Androidapi.NativeActivity, 
        Androidapi.AppGlue, 
        Androidapi.JNI.Embarcadero, 
        ServiceUnit in '..\PowerMgrService\ServiceUnit.pas' {DM: TAndroidService}; 
    
    {$R *.res} 
    
    procedure StartService; 
    var 
        Intent: JIntent; 
        PendingIntent: JPendingIntent; 
    const 
        ServicePackageName = 'com.embarcadero.services.PlayerPwrMgrServ'; 
        ApplicationPackageName = 'com.embarcadero.PlayerPowerMgr'; 
    begin 
        Intent := TJIntent.Create; 
        Intent.setClassName(
         StringToJString(ApplicationPackageName), 
         StringToJString(ServicePackageName) 
        ); 
        PendingIntent := TJPendingIntent.JavaClass.getService(TAndroidHelper.Context, 1, Intent, 0); 
        TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, 1, PendingIntent); 
    end; 
    
    
    begin 
        StartService; 
        TJFMXNativeActivity.Wrap(PAndroid_app(PANativeActivity(System.DelphiActivity)^.instance)^.activity.clazz).finish; 
    end. 
    

    もちろん、プロジェクトマネージャーの助けを借りて、サービスをアプリケーションに追加する必要があります。この行は、近くのアプリケーションで使用するために

    ServiceUnit in '..\PowerMgrService\ServiceUnit.pas' {DM: TAndroidService}; 
    

    を表示されます。

    TJFMXNativeActivity.Wrap(PAndroid_app(PANativeActivity(System.DelphiActivity)^.instance)^.activity.clazz).finish; 
    

    それは

    MainActivity.Finish 
    

    同等ですが、アプリケーションのapkのサイズは、約10M少なくなります。

    は、アプリケーション

    1)プロジェクトマネージャーマルチデバイス・アプリケーション/ブランクアプリケーション

    2)applicrionからUnit1はを削除するなど、アプリケーションを作成する作成します。

    3)プロジェクトマネージャでアプリケーションを選択し、「View Source」をクリックし、このコード

    4)アプリケーションXE10というようなDelphiのバージョンはありません

  • 関連する問題