2016-11-19 4 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, как XE10. Есть Delphi 10 Seattle и Delphi 10.1 Berlin, ни один из которых не является XE10. –

+0

Delphi 10 Seattle and Delphi 10.1 Berlin –

ответ

2

А местных сервис работает в том же процессе, что и приложение, которое запускает его. Поэтому, когда приложение завершается, значит, и сервис.

Если вам нужно долгое обслуживание, которое выделяет его хост-приложение, запустите службу в рабочем потоке в главном приложении вместо основного потока и вызовите метод Service.startForeground() в событии onStartCommand службы.

Возможно, вам необходимо будет пометить службу как удаленную, а не локальную в ее манифестах, поэтому служба запускается в своем собственном процессе. Затем ваше основное приложение может связаться с сервисом по мере необходимости, например, с помощью намерений.

+0

@ IsamBuk В Интернете много примеров. И множество учебников по каждой конкретной задаче, требуемой для этого широкого проекта. Не ожидайте, что кто-нибудь из нас здесь, на SO, напишет ваш проект для вас. –

+0

Спасибо, вы можете дать мне пример ссылки? работал в Delphi 10.1 Berlin –

+0

startForeground принимает 'JNotification', но я не знаю, как я могу получить' JNotification' от 'TNotification'. – nurettin

1
  1. Создать службу как Remote
  2. сервис Start по AlarmManager

Вот код приложения, который запускает службу и сразу выключается.

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 приложения будет около 10 миллионов меньше.

Чтобы создать такое приложение

1) Создание приложения в качестве нескольких устройств-приложений/пустым-приложение

2) В менеджере проекта удалить Unit1 из applicrion.

3) В менеджере проекта выберите приложение и нажмите кнопку «View Source», а затем вставить этот код

4) Добавить обслуживание к применению

Смежные вопросы