Android – Les services
Qu’est ce q’un service Android ?
Un service est un composant qui s’exécute en arrière-plan pour effectuer des opérations de longue durée sans avoir à interagir avec l’utilisateur et fonctionne même si l’application est détruite. Un service peut essentiellement prendre deux états.
Sr.No. | État & Description |
---|---|
1 | Started
Un service démarre lorsqu’un composant d’application, tel qu’une activité, démarre en appelant startService (). Une fois démarré, un service peut s’exécuter en arrière-plan indéfiniment, même si le composant qui l’a démarré est détruit. |
2 | Bound
Un service est Bounded lorsqu’un composant d’application se lie à celui-ci en appelant bindService (). Un service relié offre une interface client-serveur qui permet aux composants d’interagir avec le service, d’envoyer des demandes, d’obtenir des résultats, et même de les faire dans tous les processus avec communication interprocessus (IPC). |
Un service a des méthodes de cycle de vie que vous pouvez mettre en œuvre pour surveiller les changements dans l’état du service et vous pouvez effectuer un travail au stade approprié. Le diagramme suivant à gauche montre le cycle de vie lorsque le service est créé avec startService () et le diagramme à droite montre le cycle de vie lorsque le service est créé avec bindService (): (image courtoisie: android.com).
Pour créer un service, vous créez une classe Java qui étend la classe de Base de service ou l’une de ses sous-classes existantes. La classe de Base du service définit diverses méthodes de rappel et les plus importantes sont données ci-dessous. Vous n’avez pas besoin de mettre en œuvre toutes les méthodes de rappel. Cependant, il est important que vous compreniez chacun et mettez en œuvre ceux qui garantissent que votre application se comporte de la façon dont les utilisateurs attendent.
Sr.No. | Callback & Description |
---|---|
1 | onStartCommand()
Le système appelle cette méthode lorsqu’un autre composant, comme une activité, demande que le service démarre, en appelant startService (). Si vous mettez en œuvre cette méthode, il est de votre responsabilité d’arrêter le service lorsque son travail est terminé, en appelant les méthodes stopSelf () ou stopService (). |
2 | onBind()
Le système appelle cette méthode lorsqu’un autre composant veut se lier avec le service en appelant bindService (). Si vous mettez en œuvre cette méthode, vous devez fournir une interface que les clients utilisent pour communiquer avec le service, en renvoyant un objet IBinder. Vous devez toujours mettre en œuvre cette méthode, mais si vous ne voulez pas autoriser la liaison, vous devez renvoyer null. |
3 | onUnbind()
Le système appelle cette méthode lorsque tous les clients ont été déconnectés d’une interface particulière publiée par le service. |
4 | onRebind()
Le système appelle cette méthode lorsque de nouveaux clients se sont connectés au service, après avoir déjà été informé que tous s’étaient déconnectés de son onUnbind (Intent). |
5 | onCreate()
Le système appelle cette méthode lorsque le service a été créé en utilisant onStartCommand () ou onBind (). Cet appel est nécessaire pour effectuer une configuration ponctuelle. |
6 | onDestroy() Le système appelle cette méthode lorsque le service n’est plus utilisé et qu’il est détruit. Votre service devrait implémenter ceci pour nettoyer les ressources telles que les threads, les auditeurs enregistrés, les récepteurs, etc. |
Le service de squelette suivant démontre chacune des méthodes du cycle de vie :
package com.astucesinformatique; import android.app.Service; import android.os.IBinder; import android.content.Intent; import android.os.Bundle; public class HelloService extends Service { /** indicates how to behave if the service is killed */ int mStartMode; /** interface for clients that bind */ IBinder mBinder; /** indicates whether onRebind should be used */ boolean mAllowRebind; /** Called when the service is being created. */ @Override public void onCreate() { } /** The service is starting, due to a call to startService() */ @Override public int onStartCommand(Intent intent, int flags, int startId) { return mStartMode; } /** A client is binding to the service with bindService() */ @Override public IBinder onBind(Intent intent) { return mBinder; } /** Called when all clients have unbound with unbindService() */ @Override public boolean onUnbind(Intent intent) { return mAllowRebind; } /** Called when a client is binding to the service with bindService()*/ @Override public void onRebind(Intent intent) { } /** Called when The service is no longer used and is being destroyed */ @Override public void onDestroy() {}
}
Exemple
Cet exemple vous conduira à travers des étapes simples pour montrer comment créer votre propre service Android. Suivez les étapes suivantes pour modifier l’application Android que nous avons créée dans le chapitre Exemple Hello World.
Étape | Description |
---|---|
1 | Vous utiliserez Android StudioIDE pour créer une application Android et nommez-la comme Ma application sous un package com.example.astucesinformatique.myapplication comme expliqué dans le chapitre Hello World Example. |
2 | Modifiez le fichier d’activité principal MainActivity.java pour ajouter les méthodes startService () et stopService (). |
3 | Créez un nouveau fichier java MyService.java sous le package com.example.My Application. Ce fichier aura la mise en œuvre des méthodes liées au service Android. |
4 | Définissez votre service dans le fichier AndroidManifest.xml en utilisant la balise <service … />. Une application peut avoir un ou plusieurs services sans aucune restriction. |
5 | Modifiez le contenu par défaut du fichier res / layout / activity_main.xml pour inclure deux boutons dans la disposition linéaire. |
6 | Il n’est pas nécessaire de modifier les constantes dans le fichier res / values / strings.xml. Android studio prend soin de valeurs de la chaîne |
7 | Exécutez l’application pour lancer l’émulateur Android et vérifiez le résultat des modifications effectuées dans l’application. |
Voici le contenu du fichier d’activité principal modifié MainActivity.java. Ce fichier peut inclure chacune des méthodes fondamentales du cycle de vie. Nous avons ajouté les méthodes startService () et stopService () pour démarrer et arrêter le service.
package com.example.astucesinformatique7.myapplication; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.View; public class MainActivity extends Activity { String msg = "Android : "; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(msg, "The onCreate() event"); } public void startService(View view) { startService(new Intent(getBaseContext(), MyService.class)); } // Method to stop the service public void stopService(View view) { stopService(new Intent(getBaseContext(), MyService.class)); } }
Voici le contenu de MyService.java. Ce fichier peut implémenter une ou plusieurs méthodes associées au service en fonction des exigences. Pour l’instant, nous ne mettrons en œuvre que deux méthodes surStartCommand () et onDestroy ().
package com.example.astucesinformatique7.myapplication; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable; import android.widget.Toast; /** * Created by AstucesInformatique7 on 8/04/2017. */ public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // Let it continue running until it is stopped. Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); } }
Voici le contenu modifié du fichier AndroidManifest.xml. Nous avons ajouté <service … /> tag pour inclure notre service
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.astucesinformatique7.myapplication"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService" /> </application> </manifest>
Voici le contenu du fichier res / layout / activity_main.xml pour inclure deux boutons.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Example of services" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Astuces Informatique " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_above="@+id/imageButton" android:layout_centerHorizontal="true" android:layout_marginBottom="40dp" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:text="Start Services" android:onClick="startService" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop Services" android:id="@+id/button" android:onClick="stopService" android:layout_below="@+id/button2" android:layout_alignLeft="@+id/button2" android:layout_alignStart="@+id/button2" android:layout_alignRight="@+id/button2" android:layout_alignEnd="@+id/button2" /> </RelativeLayout>
Essayons d’exécuter notre Hello World modifié! Application que nous venons de modifier. Je suppose que vous avez créé votre AVD tout en effectuant l’installation de l’environnement. Pour exécuter l’application depuis Android studio, ouvrez l’un des fichiers d’activité de votre projet et cliquez sur Exécuter. Android Studio installe l’application sur votre AVD et la démarre et si tout va bien avec votre configuration et votre application, elle affichera la fenêtre Emulator suivante :
Maintenant, pour démarrer votre service, cliquez sur le bouton Démarrer le service, cela démarrera le service et selon notre programmation dans la méthode onStartCommand (), un message Service Started apparaîtra au bas du simulateur comme suit :
Pour arrêter le service, vous pouvez cliquer sur le bouton Arrêter le service.