Création de services Android
Remonter à Création d'une app Android
Sommaire
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 :
- Utilisez l'expert Nouveau service Android afin de créer le service Android. Voir Création d'un service Android.
- 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 :
- Il n'y a pas de noeuds sous Plate-forme cible (Android) : Cible, configuration et bibliothèques.
- Seule la plate-forme Android est disponible.
- Le gestionnaire de déploiement est désactivé.
- Les options Exécuter et Exécuter sans débogage sont désactivées.
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 :
- Ajoutez tous les composants visuels au module de données, et les fonctions et procédures au code.
- 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.
- Construisez le projet Service Android avant de l'ajouter à l'application afin de générer les fichiers binaires.
- Ajoutez dans le Gestionnaire de projets l'application à laquelle vous voulez ajouter le service :
- Pour une application existante, cliquez avec le bouton droit sur le groupe de projets et sélectionnez Ajouter un projet existant.
- 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.
- Sur l'application multi-périphérique, sélectionnez la plate-forme cible Android.
- Sur la plate-forme cible Android, cliquez avec le bouton droit et sélectionnez Add Android Service.
- 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 :
- 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 pour sélectionner le dossier dans lequel votre projet Service Android est enregistré.
- Choisissez cette option pour sélectionner le dossier dans lequel votre projet Service Android est enregistré. Cet expert recherche automatiquement les fichiers requis.
- Je sélectionnerai manuellement tous les fichiers requis.
- Rechercher les fichiers automatiquement à partir du chemin de base du projet.
- Cliquez sur Next.
- Si tout est correct, les fichiers sur le point d'être ajoutés à votre application multi-périphérique sont listés.
- Si une fenêtre supplémentaire demande des informations sur les chemins du service Android, enregistrez et construisez le service Android, puis réessayez.
- 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.
- 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.
- Le fichier unité.
- Le module de données, en changeant la propriété Name sur l'inspecteur d'objets.
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.
- Sur les plates-formes Android, faites un clic droit et sélectionnez Retirer le service Android.
- L'expert Retirer les services Android apparaît.
- Sélectionnez les services à retirer de la liste.
- Cliquez sur Suivant.
- 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.
- 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 :
- Incluez l'unité suivante dans la clause uses de l'interface :
Uses System.Android.Service; // Unit that contains the methods to work with services.
- 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}
- Construisez une variable TLocalServiceConnetion pour un service local, ou une variable TRemoteServiceConnection pour un service distant.
- 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;
- Créez la variable TLocalServiceConnection/TRemoteServiceConnection :
FServiceConnection1 := TLocalServiceConnection.Create; // For a local service. FServiceConnection2 := TRemoteServiceConnection.Create; // For a remote service.
- Déclarez la variable TLocalServiceConnection/TRemoteServiceConnection :
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 :
- Eviter le comptage ARC en utilisant <sectionName>L'attribut Unsafe</sectionName>l'attribut [UnSafe].
- Assigner
Nil
à la variable avant de défaire la liaison du service.
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
- Expert Service Android
- The Fundamentals about Android Services (EN)
- Android Developer Guide for Services (EN)
- Android Developer Guide for Intent Services (EN)
- Local Service Sample (EN)
- Remote Service Sample (EN)
- Exemple Android Notification Service
- Exemple Android Beacon Service
- Exemple Android Download Service