Services Android
Un service est un composant qui s'exécute en arrière-plan pour effectuer des tâches de longue durée qui ne nécessitent pas d'interaction de l'utilisateur. Il peut continuer à fonctionner même si l'application est détruite. Un service a essentiellement deux états -
| State | Description |
|---|---|
| Démarré | Lorsqu'un composant d'application Android, tel qu'une activité, démarre un service à l'aide de startService(), le service est à l'état Démarré. Une fois démarré, le service peut s'exécuter indéfiniment en arrière-plan, même si le composant qui l'a démarré est détruit. |
| Lié | Lorsqu'un composant d'application Android se lie à un service à l'aide de bindService(), le service est à l'état Lié. Un service à l'état Lié fournit une interface client-serveur qui permet aux composants d'interagir avec le service, par exemple en envoyant des requêtes, en obtenant des résultats et même en effectuant une communication inter-processus via IPC. |
Les services ont des méthodes de cycle de vie qui vous permettent de surveiller les changements d'état du service et d'effectuer un travail aux étapes appropriées. Le diagramme de gauche ci-dessous montre le cycle de vie d'un service lorsqu'il est créé via startService(), tandis que le diagramme de droite montre le cycle de vie lorsque le service est créé via bindService() :
Pour créer un service, vous devez créer une classe Java qui étend la classe de base Service ou l'une de ses sous-classes connues. La classe de base Service définit diverses méthodes de rappel et la plupart des méthodes importantes. Vous n'avez pas besoin d'implémenter toutes les méthodes de rappel. Cependant, il est toujours très important de toutes les comprendre. L'implémentation de ces rappels garantit que votre application se comporte comme les utilisateurs s'y attendent.
| Rappel | Description |
|---|---|
| onStartCommand() | Lorsque d'autres composants (tels que des activités) demandent à démarrer un service en appelant startService(), le système appelle cette méthode. Si vous implémentez cette méthode, il vous incombe d'arrêter le service lorsque son travail est terminé, à l'aide de stopSelf() ou stopService(). |
| onBind | Lorsque d'autres composants veulent se lier à un service à l'aide de bindService(), le système appelle cette méthode. Si vous implémentez cette méthode, vous devez renvoyer un objet IBinder pour fournir une interface que les clients peuvent utiliser pour communiquer avec le service. Vous devez implémenter cette méthode ; si vous ne voulez pas autoriser la liaison, renvoyez simplement null. |
| onUnbind() | Lorsqu'un client se déconnecte de toutes les interfaces publiées par le service, le système appelle cette méthode. |
| onRebind() | Lorsqu'un nouveau client se connecte au service, après avoir été précédemment informé de la déconnexion via onUnbind(Intent), le système appelle cette méthode. |
| onCreate() | Lorsque le service est créé pour la première fois via onStartCommand() et onBind(), le système appelle cette méthode. Cet appel est utilisé pour effectuer une configuration unique. |
| onDestroy() | Lorsque le service n'est plus utilisé ou est en cours de destruction, le système appelle cette méthode. Votre service doit implémenter cette méthode pour nettoyer toutes les ressources, telles que les threads, les écouteurs enregistrés, les récepteurs, etc. |
Le service principal suivant illustre le cycle de vie de chaque méthode -
package com.example.androidservices;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;
public class HelloService extends Service {
/** 标识服务如果被杀死之后的行为 */
int mStartMode;
/** 绑定的客户端接口 */
IBinder mBinder;
/** 标识是否可以使用onRebind */
boolean mAllowRebind;
/** 当服务被创建时调用. */
@Override
public void onCreate() {
}
/** 调用startService()启动服务时回调 */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return mStartMode;
}
/** 通过bindService()绑定到服务的客户端 */
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/** 通过unbindService()解除所有客户端绑定时调用 */
@Override
public boolean onUnbind(Intent intent) {
return mAllowRebind;
}
/** 通过bindService()将客户端绑定到服务时调用*/
@Override
public void onRebind(Intent intent) {
}
/** 服务不再有用且将要被销毁时调用 */
@Override
public void onDestroy() {
}
}
Exemple
Cet exemple vous montrera comment créer votre propre service Android en quelques étapes simples. Suivez les étapes ci-dessous pour modifier l'application Android créée précédemment dans le chapitre de l'exemple Hello World :
| Étape | Description |
|---|---|
| 1 | Utilisez l'IDE Android Studio pour créer une application Android nommée androidservices sous le package com.example.androidservices. Semblable au chapitre de l'exemple Hello World. |
| 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.androidservices. Ce fichier implémentera les méthodes liées au service Android. |
| 4 | Utilisez la balise <service.../> dans le fichier AndroidManifest.xml pour définir le service. Une application peut avoir un ou plusieurs services sans aucune restriction. |
| 5 | Modifiez la mise en page par défaut dans le fichier res/layout/activity_main.xml pour inclure deux boutons dans une mise en page linéaire. |
| 6 | Ne modifiez aucune constante dans le fichier res/values/strings.xml. Android Studio gérera les valeurs de chaîne. |
| 7 | Démarrez l'émulateur Android pour exécuter l'application et vérifier les résultats des modifications apportées à l'application. |
Voici le contenu modifié du fichier d'activité principal src/com.example.androidservices/MainActivity.java. Ce fichier contient toutes les méthodes de cycle de vie de base. Nous avons ajouté les méthodes startService() et stopService() pour démarrer et arrêter le service.
package com.example.androidservices;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
// Method to start the service
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 src/com.example.androidservices/MyService.java. Ce fichier peut implémenter une ou plusieurs méthodes liées au service selon les besoins. Pour les débutants, nous implémentons uniquement onStartCommand() et onDestroy() -
package com.example.androidservices;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Let it continue running until it is stopped.
Toast.makeText(this, "服务已经启动", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "服务已经停止", Toast.LENGTH_LONG).show();
}
}
Ensuite, nous allons modifier le fichier AndroidManifest.xml. Ici, nous ajoutons la balise <service.../> pour inclure notre service :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidservices"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="13"
android:targetSdkVersion="22" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<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, qui contient 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="Android 服务实例"
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="www.example.com"
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/ic_launcher.html"
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="启动服务"
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="停止服务"
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>
Voici le contenu de res/values/strings.xml, définissant deux nouvelles constantes :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Android Services</string>
<string name="title_activity_main">MainActivity</string>
<string name="menu_settings">Settings</string>
<string name="action_settings">Settings</string>
</resources>
Exécutons l'application My Application que nous venons de modifier. Je suppose que vous avez déjà créé un AVD lors de la configuration de l'environnement. Ouvrez le fichier d'activité dans votre projet et cliquez sur
l'icône pour exécuter l'application dans Android Studio. Android Studio installe l'application sur l'AVD et la lance. Si tout se passe bien, ce qui suit s'affichera dans la fenêtre de l'émulateur :

Cliquez maintenant sur le bouton « Start Service » pour démarrer le service. Cela exécutera la méthode onStartCommand() que nous avons écrite, et un message « Service started » apparaît en bas de l'émulateur, comme suit :

Cliquez sur le bouton « Stop Service » en bas pour arrêter le service.
Autres extensions