Création de services Android

De RAD Studio
Aller à : navigation, rechercher

Remonter à Création d'une app Android

Un service Android est une application sans interface utilisateur qui exécute des tâches en arrière-plan. Il y a essentiellement deux types de services :

  • Un service de type Démarré : ce service est démarré par une application Android. Le service peut s'exécuter en arrière-plan indéfiniment, même si l'application est fermée. Ce type de service exécute généralement une tâche unique et s'arrête automatiquement dès que cette tâche est terminée.
  • Un service de type Lié : ce service s'exécute uniquement lorsqu'il est lié à une application Android. Il existe une interaction entre l'application et le service, et il reste actif tant que l'application n'a pas rompu la liaison. Plusieurs applications peuvent se lier au même service.

Pour créer un nouveau projet service Android :

  1. Utilisez l'expert Nouveau service Android afin de créer le service Android. Voir Création d'un service Android.
  2. Utilisez l'expert Ajouter un nouveau service Android pour ajouter le service Android à l'application multi-périphérique. Voir Ajout d'un service Android à une application.

Il existe certaines différences entre une application autonome et une application de projet Service Android :

Création d'un service Android

RAD Studio fournit un expert de création de projets Service Android.

Pour créer un nouveau projet Service Android, choisissez Fichier > Nouveau > Autre, puis naviguez sur :

  • Projets Delphi > Android Service

Utilisez cet expert pour spécifier le type du service, local ou distant.

  • Un service local est réservé à une application. L'accès au service à partir d'autres applications est bloqué en ajoutant une ligne au fichier manifeste Android :
<service android:exported="false" android:name="com.embarcadero.services.<service_name>"/>
  • Un service distant est public, et d'autres applications peuvent y accéder. L'accès au service est accordé en ajoutant une ligne au fichier manifeste Android :
<service android:exported="true" android:name="com.embarcadero.services.<service_name>"/>

Pour plus d'informations sur les différentes options, voir Service Android.

Pour plus d'informations sur les attributs du manifeste Android, voir Exported Provider Element (EN).

Ajout d'un service Android à une application

Les services Android ne sont pas des applications autonomes : elles fonctionnent avec des applications multi-périphériques.

Dès sa création, le service apparaît sur le Gestionnaire de projets sous la forme lib<nom_projet>.so.

Pour ajouter le projet Service Android à l'application multi-périphériques :

  1. Ajoutez tous les composants visuels au module de données, et les fonctions et procédures au code.
  2. Enregistrez le projet Service Android.
    Remarque 1 : Enregistrez chaque projet Service Android dans un dossier exclusif.
    Remarque 2 : N'attribuez pas au projet Service Android le nom Service.
  3. Construisez le projet Service Android avant de l'ajouter à l'application afin de générer les fichiers binaires.
  4. Ajoutez dans le Gestionnaire de projets l'application à laquelle vous voulez ajouter le service :
    1. Pour une application existante, cliquez avec le bouton droit sur le groupe de projets et sélectionnez Ajouter un projet existant.
    2. Pour une application multi-périphérique, cliquez avec le bouton droit sur le groupe de projets et sélectionnez Ajouter un nouveau projet, puis naviguez sur :
      • Projets Delphi > Application multi-périphérique.
  5. Sur l'application multi-périphérique, sélectionnez la plate-forme cible Android.
    1. Sur la plate-forme cible Android, cliquez avec le bouton droit et sélectionnez Add Android Service.
    2. L'expert Ajouter un nouveau service Android apparaît. Deux options vous permettent d'ajouter un nouveau service Android. Choisissez l'une des options suivantes :
      1. Rechercher les fichiers automatiquement à partir du chemin de base du projet.
        • Choisissez cette option pour sélectionner le dossier dans lequel votre projet Service Android est enregistré. Cet expert recherche automatiquement les fichiers requis.
          Avertissement : Si vous disposez de plusieurs services Android dans le dossier donné, l'expert sélectionnera l'un d'eux de façon aléatoire. Si vous voulez ajouter un service Android spécifique, utilisez la deuxième option.
        • Cliquez sur Suivant.
        • Cliquez sur ProjectOptionsEllipsis.jpg pour sélectionner le dossier dans lequel votre projet Service Android est enregistré.
      2. Je sélectionnerai manuellement tous les fichiers requis.
        • Choisissez cette option pour sélectionner manuellement tous les fichiers requis.
          Avertissement : Vérifiez que l'étape 3 est terminée. Sinon, les fichiers binaires ne seront pas disponibles.
        • Cliquez sur Suivant.
        • Cliquez sur ProjectOptionsEllipsis.jpg pour sélectionner chacun des fichiers requis.
    3. Cliquez sur Next.
      1. Si tout est correct, les fichiers sur le point d'être ajoutés à votre application multi-périphérique sont listés.
      2. Si une fenêtre supplémentaire demande des informations sur les chemins du service Android, enregistrez et construisez le service Android, puis réessayez.
  6. Cliquez sur Finish pour ajouter les fichiers à l'application :
    • Le fichier binaire principal, lib<project_name>.so. Le fichier binaire est ajouté au Gestionnaire de déploiement.
    • Le fichier libProxyAndroidService.so. Cette bibliothèque est ajoutée au Gestionnaire de déploiement.
      Remarque : Ce fichier est partagé par tous les services ajoutés à l'application.
    • L'archive Java, le fichier <nom_projet>.jar. Le fichier jar est ajouté au noeud Bibliothèques sur le Gestionnaire de projets, sous la plate-forme cible Android.
    • Le fichier module de données, <nom_projet>.pas. Le module de données est ajouté au Gestionnaire de projets.
  7. Compilez l'application multi-périphérique afin de générer le fichier manifeste Android. La ligne qui correspond au type de service sélectionné auparavant (local ou distant) est ajoutée automatiquement. Voir Création d'un service Android.
    Remarque : Chaque service nécessite une déclaration de <service> correspondante dans le fichier AndroidManifest.xml. Celle-ci est ajoutée automatiquement par l'EDI.

Ajout de plusieurs services Android à une application

Vous pouvez ajouter n'importe quel nombre de services à une application Android.

Suivez les étapes spécifiées dans Ajout d'un service Android à une application pour chaque service à ajouter.

Points importants à prendre en compte :

  • Si vous avez plusieurs projets Services Android dans le même dossier et que vous souhaitez inclure l'un d'eux en particulier, choisissez la deuxième option [[# Ajout d'un service Android à une application | lors de l'étape 5.2]]. Sinon, l'expert risque d'ajouter un service Android non désirable.
  • Nommez différemment chaque projet avant de l'ajouter à l'application principale :
    • Le projet Service Android, lib<nom_service>.so.
    Remarque : N'attribuez pas au projet Service Android le nom Service.

Dépendances de projet

Les projets Service Android ajoutés à des applications multi-périphériques apparaîssent comme dépendances de projet.

Les projets Service Android transmis à l'application hôte sont activés automatiquement dans les dépendances de projet, afin d'être toujours construites avant l'application hôte.

Suppression d'un service Android d'une application

Sur l'application multi-périphérique, sélectionnez la plate-forme cible Android.

  1. Sur les plates-formes Android, faites un clic droit et sélectionnez Retirer le service Android.
  2. L'expert Retirer les services Android apparaît.
  3. Sélectionnez les services à retirer de la liste.
  4. Cliquez sur Suivant.
  5. L'expert affiche une liste d'actions à effectuer, comme la suppression des modules de données, des fichiers d'extension .so et des fichiers d'extension .jar.
  6. Cliquez sur Terminer.

Démarrage d'un service

Les services peuvent être démarrés avec ALocalServiceConnection.StartService('<nom_service>') et ALocalServiceConnection.BindService('<nom_service>'), ou ARemoteServiceConnection.StartService('<nom_service>') et ARemoteServiceConnection.BindService('<nom_service>').

Vous initialisez la variable TLocalServiceConnection à un service spécifique lors du démarrage ou de la liaison de ce service. Après cela, il n'est plus nécessaire de faire référence au nom du service pour le reste des méthodes.

Dès que vous ajoutez un service Android à votre application multi-périphérique :

  1. Incluez l'unité suivante dans la clause uses de l'interface :
    Uses
      System.Android.Service; // Unit that contains the methods to work with services.
    
  2. Incluez l'unité <nom_service.pas> dans la clause uses de l'implémentation. Cela vous permet d'utiliser toutes les méthodes définies sur le module de données du service.
    implementation
    
    uses
      MyLocalService; //Key sensitive
    
    {$R *.fmx}
    
  3. Construisez une variable TLocalServiceConnetion pour un service local, ou une variable TRemoteServiceConnection pour un service distant.
    1. Déclarez la variable TLocalServiceConnection/TRemoteServiceConnection :
      type
        TForm1 = class(TForm)
          ...
        private
          { Private declarations }
          FServiceConnection1: TLocalServiceConnection; // For a local service.
          FServiceConnection2: TRemoteServiceConnection; // For a remote service.
        public
          { Public declarations }
        end;
      
    2. Créez la variable TLocalServiceConnection/TRemoteServiceConnection :
      FServiceConnection1 := TLocalServiceConnection.Create; // For a local service.
      FServiceConnection2 := TRemoteServiceConnection.Create; // For a remote service.
      

Service Démarré

Pour un service de type Démarré, appelez StartService('<nom_service>') pour démarrer le service.

Lors de l'utilisation de services de type Démarré, vous devez gérer le processus d'arrêt du service avec JavaService.stopSelf;.

START_STICKY

L'événement OnStartCommand pour le service est défini par défaut sur START_NOT_STICKY.

  • START_STICKY (EN) est utilisé pour les services qui sont démarrés et arrêtés explicitement selon les besoins. Le système essaie de recréer le service qui a été détruit.
  • START_NOT_STICKY (EN) est utilisé pour les services qui doivent seulement rester en cours d'exécution lors du traitement des commandes envoyées à ces services. Si le processus est détruit, le service n'est pas redémarré automatiquement.

Si vous voulez avoir un START_STICKY sur l'événement OnStartCommand, vous devez le spécifier sur le service :

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

Pour plus d'informations, voir Service Lifecycle (EN).

Service Lié

Pour un service de type Lié, appelez BindService('<nom_service>') pour effectuer la liaison au service afin que vous puissiez démarrer l'interaction avec lui, et UnBindService pour se déconnecter du service.

Pour plus d'informations, voir Bound Services (EN).

Méthodes BindService / UnBindService

Lorsque l'application principale appelle BindService('<nom_service>'), la variable de connexion obtient un pointeur sur l'adresse mémoire où le service s'exécute.

Après avoir établi la connexion avec un service spécifique, lorsque vous appelez UnBindService et que l'application est la seule liée au service, ce dernier se libère lui-même. N'oubliez pas que la variable connexion de l'application principale reste pointée sur la même adresse mémoire. Une nouvelle liaison avec le même service peut provoquer un blocage de l'application principale car l'adresse mémoire du service peut être non valide.

Il existe deux moyens de gérer cette situation :

Utilisation de l'attribut [Unsafe]

  private
    { Private declarations }
    [Unsafe] Service1: TAndroidService1DM;

Pour de plus amples informations, voir L'attribut Unsafe.

Evénement OnBind

Lorsque vous appelez BindService('<nom_service>') sur votre application, l'événement OnBind se déclenche sur le projet Service Android. La méthode OnBind renvoie un objet IBinder qui est responsable de la gestion de la connexion au service.

La redéfinition de la méthode OnBind a pour conséquence que l'événement ne renvoie pas l'objet IBinder nécessaire à l'application principale pour amener le module de données depuis le service.

Pour utiliser la méthode OnBind :

  • Sur la méthode OnBind, renvoyez l'objet IBinder :
function TAndroidServiceDM.AndroidServiceBind(const Sender: TObject;
  const AnIntent: JIntent): JIBinder;
begin
  // .... User's code
  Result := GetBinder(Self);
end;

Voir aussi