Перейти к содержанию
Fire Monkey от А до Я
  • 0

Запустить приложение из сервиса или показать форму


albionseo

Вопрос

Привет, создал сервис на delphi 10 seattle, сервис запускается из приложения, после само приложение можно закрыть или свернуть, но сам сервис работает все время, из него я делаю парсинг сайта и при определенном значении мне нужно уведомить пользователя об этом, причем сделать это моментально используюя вибрацию, звук и т.д., я думаю что нужно как то вновь запустить приложение и из него уже это делать, но как собственно запустить приложение?

Изменено пользователем albionseo
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Для каждого приложения, в котором будет интегрирован механизм push-уведомлений, необходимо создать новый App ID и provisioning profile, а также SSL-сертификат для сервера

я так понял вы не знаете что такое пуш...

какой провизинг? какой для андроида SSL ? вы лучше по подробнее ознакомьтесь, тем более здесь на форуме я все про пуши разжевал...

ну поясню чуток токен клиента это уникальный ОДИН код чтобы идентифицировать "Гаджет+программу", из-за отсутств. этого понимания

на сайте этом будет еще полно вопросов типа "как отправить сообщение конкретному клиенту"...))

Ссылка на комментарий
  • 0

 

Для каждого приложения, в котором будет интегрирован механизм push-уведомлений, необходимо создать новый App ID и provisioning profile, а также SSL-сертификат для сервера

я так понял вы не знаете что такое пуш...

какой провизинг? какой для андроида SSL ? вы лучше по подробнее ознакомьтесь, тем более здесь на форуме я все про пуши разжевал...

ну поясню чуток токен клиента это уникальный ОДИН код чтобы идентифицировать "Гаджет+программу", из-за отсутств. этого понимания

на сайте этом будет еще полно вопросов типа "как отправить сообщение конкретному клиенту"...))

 

я не задаю вопрос как отправить конкретно одному клиенту или группе я объяснил как работает   мое приложение

App ID и provisioning profile

Ссылка на комментарий
  • 0

Вы получили в сервисе сигнал, создавайте локальное сообщение и будет там все и вибро и звук все как у Push.

Затем по клику сообщения и откроется ваша программа.

 

Здравствуйте , я не понимаю всех возможностей и поэтому спрошу.

Хочу в сервисе для андройда (10 дельфи), обратиться по tcp/ip, послать через NotificationCenter сообщеение (ярлык) что есть новые данные. - по нему запустится приложение

Ссылка на комментарий
  • 0

куда в сервисе прописать данный код что бы он выводил сообщения

n:= form1.NotificationCenter1.CreateNotification;
n.Name:='123';
n.Title:='567';
n.AlertBody:='890';
n.AlertAction:='qwe';
n.EnableSound:=true;

form1.NotificationCenter1.ScheduleNotification(n);

Ссылка на комментарий
  • 0

куда в сервисе прописать данный код что бы он выводил сообщения

n:= form1.NotificationCenter1.CreateNotification;

n.Name:='123';

n.Title:='567';

n.AlertBody:='890';

n.AlertAction:='qwe';

n.EnableSound:=true;

form1.NotificationCenter1.ScheduleNotification(n);

Открой сэмплы, посмотри видосики что в этой теме кидали. Там все легко и просто)

Ссылка на комментарий
  • 0

Ребята, я перечитал тему и понял что сервис не может общаться с формой. но мне это не нужно. можно ли просто запустить из сервиса приложение - не передавая ему никакие данные... просто запустить?..

суть проблемы - сервис запустился после старта ОС. если есть файл run.txt на внешней карте, то запускает само приложение. если нету то ничего не далает. 

самое оптимальное это писать в BootCompletedReceiver.java код (склеивать classes.dex)? привел примерный псевдокод. я не знаю как на яве проверить есть ли такой файл..

а есть ли другие способы просто запустить из сервиса само приложение? или железно нет.???

дополнительно может ли сервис как то знать - запущено ли приложение основное - надо ли давать в шторку информацию или мы и так её видем в приложении

package com.PanelControlReceiver;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;


public class BootCompletedReceiver extends BroadcastReceiver {


 public void onReceive(Context context, Intent intent) {


  if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
   Intent TestLauncher = new Intent();
            TestLauncher.setClassName(context, "com.embarcadero.services.PanelControlService");    context.startService(TestLauncher);
//запустили сервис. нужен всегда что бы давать в шторки сообщения

>>>>>>>>>>>>>>>>>>>>>>>>
if  (fileexist("run.txt")) then { TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity"); TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   context.startActivity(TestLauncher); }
>>>>>>>>>>>>>>>>>>>>>>>>  
//запустили сразу приложение если нужно


  }


 }
  
}
Изменено пользователем fsdb
Ссылка на комментарий
  • 0

в общем не стал париться особо и просто сделал так:

package com.PanelControlReceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import java.io.File;

public class BootCompletedReceiver extends BroadcastReceiver {

 public void onReceive(Context context, Intent intent) {

  if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
  
 Intent TestLauncher = new Intent();
//создаем класс

 File f = new File("/sdcard/Android/data/com.embarcadero.PanelControl/files/ehs_setting/run_app.txt");
//файл - при наличии которого выполняется автозапуск

 if(!f.exists()){
            TestLauncher.setClassName(context, "com.embarcadero.services.PanelControlService");
   context.startService(TestLauncher);
}
else
{
TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
   TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   context.startActivity(TestLauncher);
}


  }


 }
  
}

Ссылка на комментарий
  • 0

fsdb, Создаем, например, в сервисе поток, в нем делаем запрос к сайту, получаем html, парсим.

Ярослав за такой код спасибо не скажет, поэтому адрес замените :) 

unit Unit2;

interface

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

type
  TMyThread = class(TThread)
  private
    function MyFunc():String;
    function GetTitle(HtmlCode:string):String;
  protected
    FURL: string;
  public
    constructor Create(const aURL: string);
    destructor Destroy; override;
    procedure Execute; override;
    property URL: string read FURL;
  end;

type
  TAndroidServiceDM = class(TAndroidService)
    function AndroidServiceStartCommand(const Sender: TObject;
      const Intent: JIntent; Flags, StartId: Integer): Integer;
  private
    { Private declarations }
    aMyThread: TMyThread;
  public
    { Public declarations }
  end;



var
  AndroidServiceDM: TAndroidServiceDM;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

uses
  System.Net.HTTPClientComponent, System.Net.HttpClient,
  Androidapi.JNI.App;

function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  aMyThread:=TMyThread.Create('http://fire-monkey.ru/');
  Result:=TJService.JavaClass.START_STICKY;
end;

constructor TMyThread.Create(const aURL: string);
begin
  FURL:=aURL;
  inherited Create(False);
end;

destructor TMyThread.Destroy;
begin
  inherited;
end;

procedure TMyThread.Execute;
var
  aResponser:string;
begin
  try
    while not terminated do
    begin
      Sleep(15000);
      try
        aResponser:=MyFunc;
      finally
      end;
    end;
  except on E:Exception do
    //
  end;
end;


function TMyThread.GetTitle(HtmlCode:string):String;
var // парсим Title
  s:string;
begin
  Result:=Copy(HtmlCode,Pos('<title>',HtmlCode)+7,Pos('</title>',HtmlCode)-Pos('<title>',HtmlCode)-7);
end;

function TMyThread.MyFunc():String;
var
  aHTTPResponse: IHTTPResponse;
  aResponser: String;
  sStream: TStringStream;
  aHttpClient: TNetHTTPClient;
begin
  aResponser:='';
  Result:=aResponser;
  try
    aHttpClient := TNetHTTPClient.Create(nil);
    aHTTPClient.AllowCookies  :=true;
    aHTTPClient.AcceptLanguage:='ru-RU;q=0.8,en-US;q=0.5,en;q=0.3';
    aHTTPClient.ContentType   :='text/html';
    aHTTPClient.AcceptCharset :='utf-8';
    aHTTPClient.Accept        :='text/json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';

    try
      sStream := TStringStream.Create();
      try        
        aHTTPResponse := aHttpClient.Get(FURL, sStream); // get сервера (/wait)
        if (aHTTPResponse<>nil) then
          aResponser:=GetTitle(sStream.DataString);
        else aResponser:='';
      except on E:Exception do
        //
      end;
    finally
      aHttpClient.Free;
      sStream.Free;
    end;
  finally    
    Result:=aResponser;
  end;
end;

end.

Приложение один раз запустить в любом случае придется.

Если приложение закрыть вручную, то запросы перестают идти (почему не знаю). А если приложение "убивает" сам андроид (например если мало оперативной памяти), то запросы идут как и положено

Изменено пользователем Rusland
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...