Le service Android doit toujours s’exécuter (ne jamais interrompre ou arrêter)

J’ai créé un service et je veux toujours exécuter ce service jusqu’à ce que mon téléphone redémarre ou se ferme. Le service doit être exécuté en arrière-plan.

Exemple de code de service créé et services de démarrage:

Démarrer le service:

Intent service = new Intent(getApplicationContext(), MyService.class); getApplicationContext().startService(service); 

Le service:

 public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO do something useful HFLAG = true; //smsHandler.sendEmptyMessageDelayed(DISPLAY_DATA, 1000); return Service.START_NOT_STICKY; } @Override public IBinder onBind(Intent intent) { // TODO for communication return IBinder implementation return null; } } 

Déclaration manifeste:

   

Est-il possible d’exécuter ce service toujours comme lorsque l’application s’arrête et toute autre chose. Après un certain temps, mon application se met en pause et les services font également une pause ou s’arrêtent. Alors, comment puis-je exécuter ce service en arrière-plan et toujours.

“Est-il possible d’exécuter ce service toujours comme lorsque l’application est en pause et autre chose?”

Oui.

  1. Dans le service, la méthode onStartCommand renvoie START_STICKY.

     public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } 
  2. Démarrez le service en arrière-plan à l’aide de startService (MyService) afin qu’il rest toujours actif quel que soit le nombre de clients liés.

     Intent intent = new Intent(this, PowerMeterService.class); startService(intent); 
  3. Créez le classeur.

     public class MyBinder extends Binder { public MyService getService() { return MyService.this; } } 
  4. Définir une connexion de service.

     private ServiceConnection m_serviceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { m_service = ((MyService.MyBinder)service).getService(); } public void onServiceDisconnected(ComponentName className) { m_service = null; } }; 
  5. Lier au service à l’aide de bindService.

      Intent intent = new Intent(this, MyService.class); bindService(intent, m_serviceConnection, BIND_AUTO_CREATE); 
  6. Pour votre service, vous voudrez peut-être une notification pour lancer l’activité appropriée une fois celle-ci fermée.

     private void addNotification() { // create the notification Notification.Builder m_notificationBuilder = new Notification.Builder(this) .setContentTitle(getText(R.ssortingng.service_name)) .setContentText(getResources().getText(R.ssortingng.service_status_monitor)) .setSmallIcon(R.drawable.notification_small_icon); // create the pending intent and add to the notification Intent intent = new Intent(this, MyService.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); m_notificationBuilder.setContentIntent(pendingIntent); // send the notification m_notificationManager.notify(NOTIFICATION_ID, m_notificationBuilder.build()); } 
  7. Vous devez modifier le manifeste pour lancer l’activité en mode top unique.

      android:launchMode="singleTop" 
  8. Notez que si le système a besoin des ressources et que votre service n’est pas très actif, il peut être tué. Si cela est inacceptable, amenez le service au premier plan en utilisant startForeground.

      startForeground(NOTIFICATION_ID, m_notificationBuilder.build()); 

Pour démarrer un service dans son propre processus, vous devez spécifier les éléments suivants dans la déclaration XML.

   

Ici vous pouvez trouver un bon tutoriel qui m’a été vraiment utile

http://www.vogella.com/articles/AndroidServices/article.html

J’espère que cela t’aides

Une solution simple consiste à redémarrer le service lorsque le système l’arrête.

J’ai trouvé cette implémentation très simple de cette méthode:

Comment rendre le service Android impossible à arrêter

Vous pouvez implémenter startForeground pour le service et même s’il meurt, vous pouvez le redémarrer en utilisant START_STICKY sur startCommand() . Pas sûr que ce soit la bonne implémentation.

Si vous avez déjà un service et que vous voulez qu’il fonctionne tout le temps, vous devez append 2 choses:

  1. dans le service lui-même:

     public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } 
  2. Dans le manifeste:

     android:launchMode="singleTop" 

Pas besoin d’append une liaison, sauf si vous en avez besoin dans le service.

J’ai surmonté ce problème et mon exemple de code est le suivant.

Ajoutez la ligne ci-dessous dans votre activité principale, ici BackGroundClass est la classe de service. Vous pouvez créer cette classe dans Nouveau -> JavaClass (Dans cette classe, ajoutez le processus (tâches) dans lequel vous devez vous trouver en arrière-plan). Pour plus de commodité, notez-les d’abord avec la sonnerie de notification comme processus d’arrière-plan.

  startService(new Intent(this, BackGroundClass .class)); 

Dans le BackGroundClass, incluez simplement mes codages et vous pourrez voir le résultat.

 import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; import android.provider.Settings; import android.support.annotation.Nullable; import android.widget.Toast; public class BackgroundService extends Service { private MediaPlayer player; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { player = MediaPlayer.create(this,Settings.System.DEFAULT_RINGTONE_URI); player.setLooping(true); player.start(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); player.stop(); } } 

Et dans AndroidManifest.xml, essayez d’append ceci.

  

Exécutez le programme, ouvrez simplement l’application, vous pouvez trouver l’alerte de notification en arrière-plan. Même, vous pouvez quitter l’application mais vous avez peut-être entendu l’alerte de sonnerie, à moins que et jusqu’à ce que vous ayez désactivé l’application ou Désinstaller l’application. Cela indique que l’alerte de notification est en arrière-plan. Comme cela, vous pouvez append un processus pour l’arrière-plan.

Kind Attention: S’il vous plaît, ne pas vérifier avec TOAST car il ne fonctionnera qu’une seule fois même s’il était en arrière-plan.

J’espère que ça aidera … !!

J’ai trouvé un moyen simple et clair de garder le Service toujours opérationnel.

Ce gars l’a expliqué très clairement et a utilisé un bon algorithme. Son approche consiste à envoyer une diffusion lorsque le service est sur le point d’être tué, puis à l’utiliser pour redémarrer le service.

Vous devriez le vérifier: http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android

Ajoutez ceci dans le manifeste.

   

Ajouter une classe de service.

 public class YourServiceName extends Service { @Override public void onCreate() { super.onCreate(); // Timer task makes your service will repeat after every 20 Sec. TimerTask doAsynchronousTask = new TimerTask() { @Override public void run() { handler.post(new Runnable() { public void run() { // Add your code here. } }); } }; //Starts after 20 sec and will repeat on every 20 sec of time interval. timer.schedule(doAsynchronousTask, 20000,20000); // 20 sec timer (enter your own time) } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO do something useful return START_STICKY; } }