I. Présentation▲
Un service est une composante essentielle d'une application. Il est nécessaire lorsque votre application souhaite effectuer des opérations ou des calculs en dehors de l'interaction utilisateur. Donc comme vous l'aurez compris un service ne dispose pas d'interface graphique.
Rien de mieux qu'un exemple, votre lecteur de musique vous permet d'écouter la musique tout en surfant sur Internet, lisant vos mails et cette fonctionnalité n'est possible qu'à l'aide des services.
Il existe deux types de services :
- LocalService : services qui s'exécutent dans le même processus que votre application ;
- RemoteService : ils s'exécutent dans des processus indépendants de votre application.
II. Cycle de vie d'un service▲
Un service n'a pas de durée définie, il est là pour exécuter sa tâche et il fonctionnera tant que c'est nécessaire. On va présenter les différentes méthodes qui correspondent au cycle de vie d'un service. Ces méthodes seront à surcharger quand vous créerez votre service :
- OnCreate() : cette méthode est appelée à la création du service et est en général utilisée pour initialiser ce qui sera nécessaire à votre service ;
- OnStart(Intent i) : le service démarre. Valable uniquement pour les versions du SDK inférieur à 2.0 ;
- OnStartCommand(Intent i, int flags, int startId) : le service démarre. Valable uniquement pour les versions du SDK supérieur à 2.0 ;
- OnDestroy() : appelé à la fermeture du service.
III. Mon premier Service▲
Nous allons faire un exemple pour mieux comprendre, dans ce dernier nous allons créer un service qui affichera un toast contenant les coordonnées du téléphone. Le toast s'affichera quand les coordonnées seront mises à jour.
Nous allons créer un projet qui s'appellera MonPremierService, avec la version 2.1 du SDK.
- Nom de l'application : MonPremierService
- Package : com.tuto.android
- Activité : HomeActivity
Dans notre classe HomeActivity, nous allons juste créer un bouton qui lancera le service quand on cliquera dessus.
Dans le fichier main.xml, on met le code suivant :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns
:
android
=
"http://schemas.android.com/apk/res/android"
android
:
orientation
=
"vertical"
android
:
layout_width
=
"fill_parent"
android
:
layout_height
=
"fill_parent"
>
<Button
android
:
layout_width
=
"fill_parent"
android
:
layout_height
=
"wrap_content"
android
:
text
=
"@string/btn1"
android
:
id
=
"@+id/serviceBtn"
/>
</LinearLayout>
et voici le code à mettre dans l'activité correspondante
package
com.tuto.android;
import
android.app.Activity;
import
android.content.Intent;
import
android.os.Bundle;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
public
class
HomeActivity extends
Activity {
@Override
public
void
onCreate
(
Bundle savedInstanceState) {
super
.onCreate
(
savedInstanceState);
setContentView
(
R.layout.main);
Button serviceBtn =
(
Button) findViewById
(
R.id.serviceBtn);
serviceBtn.setOnClickListener
(
new
OnClickListener
(
)
{
@Override
public
void
onClick
(
View actuelView)
{
startService
(
new
Intent
(
HomeActivity.this
, MonPremierService.class
));
}
}
);
}
}
Passons à notre service, pour le créer il suffit d'implémenter une classe qui hérite de la classe Service. Voici notre exemple :
package
com.tuto.android;
import
android.app.Service;
import
android.content.Context;
import
android.content.Intent;
import
android.location.Location;
import
android.location.LocationListener;
import
android.location.LocationManager;
import
android.os.Bundle;
import
android.os.IBinder;
import
android.widget.Toast;
public
class
MonPremierService extends
Service
{
private
LocationManager locationMgr =
null
;
private
LocationListener onLocationChange =
new
LocationListener
(
)
{
@Override
public
void
onStatusChanged
(
String provider, int
status, Bundle extras)
{
}
@Override
public
void
onProviderEnabled
(
String provider)
{
}
@Override
public
void
onProviderDisabled
(
String provider)
{
}
@Override
public
void
onLocationChanged
(
Location location)
{
Double latitude =
location.getLatitude
(
);
Double longitude =
location.getLongitude
(
);
Toast.makeText
(
getBaseContext
(
),
"Voici les coordonnées de votre téléphone : "
+
latitude +
" "
+
longitude,
Toast.LENGTH_LONG).show
(
);
}
}
;
@Override
public
IBinder onBind
(
Intent arg0)
{
return
null
;
}
@Override
public
void
onCreate
(
)
{
locationMgr =
(
LocationManager) getSystemService
(
Context.LOCATION_SERVICE);
locationMgr.requestLocationUpdates
(
LocationManager.NETWORK_PROVIDER, 10000
,
0
, onLocationChange);
locationMgr.requestLocationUpdates
(
LocationManager.GPS_PROVIDER, 10000
, 0
,
onLocationChange);
super
.onCreate
(
);
}
@Override
public
int
onStartCommand
(
Intent intent, int
flags, int
startId)
{
return
super
.onStartCommand
(
intent, flags, startId);
}
@Override
public
void
onDestroy
(
)
{
super
.onDestroy
(
);
locationMgr.removeUpdates
(
onLocationChange);
}
}
- Dans le OnCreate, on s'abonne au changement de géolocalisation, et dans le OnDestroy on se désabonne.
- On crée une instance de la classe LocationListener, pour récupérer les nouvelles coordonnées.
- Dans la méthode OnLocationChanged, on affiche les coordonnées à l'aide d'un Toast.
- La méthode onBind sert quand on veut faire communiquer le service avec un autre service, ou avec une activité …
Pour finir, il faut déclarer le service dans le fichier AndroidManifest.xml, dans la partie Application
<service
android
:
name
=
"com.tuto.android.MonPremierService"
/>
Sans oublier les permissions suivantes :
<uses-permission
android
:
name
=
"android.permission.INTERNET"
/>
<uses-permission
android
:
name
=
"android.permission.ACCESS_FINE_LOCATION"
/>
<uses-permission
android
:
name
=
"android.permission.ACCESS_GPS"
/>
<uses-permission
android
:
name
=
"android.permission.ACCESS_ASSISTED_GPS"
/>
<uses-permission
android
:
name
=
"android.permission.LOCATION"
/>
Ce qui donnera :
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns
:
android
=
"http://schemas.android.com/apk/res/android"
package
=
"com.tuto.android"
android
:
versionCode
=
"1"
android
:
versionName
=
"1.0"
>
<application
android
:
icon
=
"@drawable/icon"
android
:
label
=
"@string/app_name"
>
<activity
android
:
name
=
".HomeActivity"
android
:
label
=
"@string/app_name"
>
<intent-filter>
<action
android
:
name
=
"android.intent.action.MAIN"
/>
<category
android
:
name
=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<service
android
:
name
=
"com.tuto.android.MonPremierService"
/>
</application>
<uses-permission
android
:
name
=
"android.permission.INTERNET"
/>
<uses-permission
android
:
name
=
"android.permission.ACCESS_FINE_LOCATION"
/>
<uses-permission
android
:
name
=
"android.permission.ACCESS_GPS"
/>
<uses-permission
android
:
name
=
"android.permission.ACCESS_ASSISTED_GPS"
/>
<uses-permission
android
:
name
=
"android.permission.LOCATION"
/>
</manifest>
Sans oublier le fichier strings.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string
name
=
"btn1"
>
Lancer le service de géolocalisation</string>
<string
name
=
"app_name"
>
Mon Premier Service</string>
</resources>
IV. Résultat▲
Donc pour tester il suffit de :
- lancer sur le projet ;
- cliquer sur le bouton ;
- mettre à jour les coordonnées de géolocalisation ;
- un Toast devrait apparaitre avec les coordonnées de géolocalisation.
Voilà ce que vous devez obtenir :
Sur l'image ci-dessous, on voit bien que le service est lancé (propriétés applications dans les paramètres du téléphone).
Voilà ce tutoriel se finit ici, en espérant qu'il vous a aidé à comprendre comment fonctionne les services sous Android.
V. Remerciements▲
Je tiens à remercier tout particulièrement Feanorin qui a mis ce tutoriel au format Developpez.com.
Merci également à ram-0000 d'avoir pris le temps de le relire et de le corriger.