Android - Services

UNE serviceest un composant qui s'exécute en arrière-plan pour effectuer des opérations de longue durée sans avoir besoin d'interagir avec l'utilisateur et qui fonctionne même si l'application est détruite. Un service peut essentiellement prendre deux états -
N ° Sr. État et description
1

Started

Un service est startedlorsqu'un composant d'application, comme une activité, le 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 boundlorsqu'un composant d'application s'y lie en appelant bindService () . Un service lié 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 le faire à travers des processus avec une communication interprocessus (IPC).

Un service a des méthodes de rappel de cycle de vie que vous pouvez implémenter pour surveiller les modifications de l'état du service et vous pouvez effectuer le travail à l'étape appropriée. 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 Service ou l'une de ses sous-classes existantes. leServiceLa classe de base définit diverses méthodes de rappel et les plus importantes sont données ci-dessous. Vous n'avez pas besoin d'implémenter toutes les méthodes de rappel. Cependant, il est important que vous compreniez chacun d'eux et implémentiez ceux qui garantissent que votre application se comporte comme les utilisateurs l'attendent.

N ° Sr. Rappel et description
1

onStartCommand()

Le système appelle cette méthode lorsqu'un autre composant, tel qu'une activité, demande que le service soit démarré, en appelant startService () . Si vous implémentez 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 souhaite se lier au service en appelant bindService () . Si vous implémentez 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 implémenter cette méthode, mais si vous ne souhaitez pas autoriser la liaison, vous devez retourner null .

3

onUnbind()

Le système appelle cette méthode lorsque tous les clients se sont 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 été préalablement averti que tous s'étaient déconnectés dans son onUnbind (Intent) .

5

onCreate()

Le système appelle cette méthode lorsque le service est créé pour la première fois à l'aide de onStartCommand () ou onBind () . Cet appel est nécessaire pour effectuer une configuration unique.

6

onDestroy()

Le système appelle cette méthode lorsque le service n'est plus utilisé et est en cours de destruction. Votre service doit l'implémenter pour nettoyer toutes les ressources telles que les threads, les écouteurs enregistrés, les récepteurs, etc.

Le service squelette suivant illustre chacune des méthodes du cycle de vie -

package com.tutorialspoint;

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 guidera à 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 de Hello World -

Étape La description
1 Vous utiliserez Android StudioIDE pour créer une application Android et la nommerez My Application sous un package com.example.tutorialspoint7.myapplication comme expliqué dans le chapitre Exemple de 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.My Application . Ce fichier aura l'implémentation des méthodes liées au service Android.
4 Définissez votre service dans le fichier AndroidManifest.xml à l'aide de 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 Pas besoin de modifier les constantes dans le fichier res / values ​​/ strings.xml . Le studio Android prend en charge les valeurs de chaîne
sept Exécutez l'application pour lancer l'émulateur Android et vérifier 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.tutorialspoint7.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 avoir l'implémentation d'une ou plusieurs méthodes associées au service en fonction des besoins. Pour l'instant, nous allons implémenter seulement deux méthodes onStartCommand () et onDestroy () -

package com.example.tutorialspoint7.myapplication;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;

/**
   * Created by TutorialsPoint7 on 8/23/2016.
*/

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 . Ici, nous avons ajouté 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.tutorialspoint7.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 de res/layout/activity_main.xml fichier 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="Tutorials point "
      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 modifié Hello World!application que nous venons de modifier. Je suppose que vous avez créé votreAVDlors de la configuration de l'environnement. Pour exécuter l'application à partir du studio Android, ouvrez l'un des fichiers d'activité de votre projet et cliquez sur l' icône Exécuter dans la barre d'outils. Android Studio installe l'application sur votre AVD et la démarre et si tout va bien avec votre configuration et votre application, elle s'affichera à la suite de la fenêtre de l'émulateur -

Maintenant, pour démarrer votre service, cliquons sur Start 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.