116 votes

Android lance un service au démarrage, comment redémarrer la classe de service après le redémarrage de l'appareil ?

J'ai besoin de démarrer un service au moment du démarrage. J'ai beaucoup cherché. Ils parlent de Broadcastreceiver. Comme je suis nouveau dans le développement Android, je n'ai pas une image claire des services sur Android. Veuillez me fournir du code source.

25 votes

@user244540 : S'il vous plaît, ne "démarrez pas un service au moment du démarrage" avec l'intention de le faire fonctionner pour toujours, à moins qu'il ne fournisse continuellement de la valeur (par exemple, un client VOIP). Dans ces cas, utilisez startForeground() à votre service. Sinon, Android et ses utilisateurs supprimeront votre service comme étant un gaspillage d'espace, et vous recevrez des commentaires désagréables sur l'Android Market. Dans la plupart des cas où vous souhaitez qu'un service démarre au moment du démarrage, il est préférable d'utiliser la commande AlarmManager pour que votre service puisse fonctionner périodiquement plutôt que en permanence .

2 votes

@CommonsWare : Bon point. Cependant, notez que pour commencer les exécutions périodiques par AlarmManager après le redémarrage, vous devez suivre des étapes très similaires (la différence étant dans le contenu du fichier onReceive méthode)

1 votes

@CommonsWare : Très bon commentaire, je suis tombé par hasard sur cette question et votre indice correspond exactement à ma situation. Si c'était une réponse, j'aurais voté pour elle :-)

197voto

Vladimir Ivanov Points 23731

Votre récepteur :

public class MyReceiver extends BroadcastReceiver {   

    @Override
    public void onReceive(Context context, Intent intent) {

     Intent myIntent = new Intent(context, YourService.class);
     context.startService(myIntent);

    }
}

Votre AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.broadcast.receiver.example"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">

        <activity android:name=".BR_Example"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    <!-- Declaring broadcast receiver for BOOT_COMPLETED event. -->
        <receiver android:name=".MyReceiver" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    </application>

    <!-- Adding the permission -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

</manifest>

5 votes

Le lien vers l'article est mort mais l'exemple de code est tout ce dont vous avez besoin de toute façon, donc +1 :)

3 votes

En fait, il faut l'améliorer un peu, vous devez utiliser le wakelock dans le récepteur, sinon il y a une petite chance que votre service ne démarre pas.

0 votes

Dois-je démarrer mon portable au moins une fois pour que cela fonctionne ?

97voto

Peter Knego Points 57985

Créer un BroadcastReceiver et l'enregistrer pour recevoir ACTION_BOOT_COMPLETED . Vous devez également RECEIVE_BOOT_COMPLETED permission.

Lisez : Écouter et diffuser des messages mondiaux, et réglage des alarmes

2 votes

Qu'en est-il du verrouillage du réveil ? pendant que le service est lancé, l'appareil peut décider de s'endormir...

0 votes

Dois-je démarrer mon mobile au moins une fois pour lancer un service ?

0 votes

@MarianPazdzioch a raison ; vous avez besoin d'un verrou de sillage. Voir ma réponse ci-dessous : stackoverflow.com/a/30970167/473201

33voto

jjoe64 Points 3260

Il est possible d'enregistrer votre propre service d'application pour démarrer automatiquement lorsque l'appareil a été démarré. Vous en avez besoin, par par exemple, lorsque vous souhaitez recevoir des événements push d'un serveur http et que vous et que vous souhaitez informer l'utilisateur dès qu'un nouvel événement se produit. L'utilisateur n'a pas à n'a pas à lancer l'activité manuellement avant que le service ne démarre...

C'est très simple. D'abord, donnez à votre application la permission RECEIVE_BOOT_COMPLETED. Ensuite, vous devez enregistrer un BroadcastReveiver. Nous l'appelons BootCompletedIntentReceiver.

Votre Manifest.xml devrait maintenant ressembler à ceci :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.jjoe64">
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 <application>
  <receiver android:name=".BootCompletedIntentReceiver">
   <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
  </receiver>
  <service android:name=".BackgroundService"/>
 </application>
</manifest>

La dernière étape consiste à mettre en œuvre le récepteur. Ce récepteur démarre simplement votre service d'arrière-plan.

package com.jjoe64;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import com.jjoe64.BackgroundService;

public class BootCompletedIntentReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
   Intent pushIntent = new Intent(context, BackgroundService.class);
   context.startService(pushIntent);
  }
 }
}

De http://www.jjoe64.com/2011/06/autostart-service-on-device-boot.html

3 votes

Identique au précédent mais vraiment simple et rapide, utilisez celui-ci si vous passez par cet article.

0 votes

La seule différence est que le service est déclaré dans le manifeste, ce qui est correct.

0 votes

Il n'est pas seulement correct de déclarer votre service dans le manifeste, c'est obligatoire. Comme pour les activités

1voto

user2458368 Points 29

Enregistrez également le service que vous avez créé dans le Manifeste et la permission d'utilisation comme

<application ...>
   <service android:name=".MyBroadcastReceiver">
        <intent-filter>
            <action android:name="com.example.MyBroadcastReciver"/>
        </intent-filter>
   </service>
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

et ensuite en braod cast Reciever appeler votre service

public class MyBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent myIntent = new Intent(context, MyService.class);
        context.startService(myIntent);
    }
}

0 votes

Pourquoi le filtre d'intention à l'intérieur du service ?

0 votes

Parce que lorsque le démarrage est terminé, le MyService sera appelé.

0 votes

Dans ce cas, votre classe de service va étendre le service et diffuser le récepteur. Ai-je raison ?

0voto

Manoj Tarkar Points 55

Commencez par enregistrer un récepteur dans votre fichier manifest.xml :

    <receiver android:name="com.mileagelog.service.Broadcast_PowerUp" >
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>

et ensuite écrire une diffusion pour ce récepteur comme :

public class Broadcast_PowerUp extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
        Toast.makeText(context, "Service_PowerUp Started",
                Toast.LENGTH_LONG).show();

    } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {

        Toast.makeText(context, "Service_PowerUp Stoped", Toast.LENGTH_LONG)
        .show();
    }
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X