IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Service qui plante si démarré au boot


Sujet :

Android

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 164
    Points : 227
    Points
    227
    Par défaut Service qui plante si démarré au boot
    Bonjour,

    Je suis en train de faire une application qui devra mettre à jour ces données. Pour cela le système de mise à jour doit pouvoir ce lancer à intervalle régulier (pour les tests 1min) et ce depuis le démarrage du téléphone.

    Le problème c'est que malgré tous les tuto que j'ai pu lire cela ne fonctionne pas. Si le service de mise à jour (UpdateService) est démarrée depuis une activity cela fonctionne mais pas depuis le boot au démarrage qui pourtant démarre comme il faut.

    La classe qui ce lance au démarrage du téléphone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package src.updates;
     
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
     
    public class AutoStartNotifyReceiver extends BroadcastReceiver {
        private final String BOOT_COMPLETED_ACTION = "android.intent.action.BOOT_COMPLETED";
     
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(BOOT_COMPLETED_ACTION)) {
                System.out.println("AutoStartNotifyReceiver::onReceive");
     
                Intent myIntent = new Intent(context, UpdateService.class);
                context.startService(myIntent);
     
                System.out.println("AutoStartNotifyReceiver::onReceive done");
            }
        }
    }
    Les lignes AutoStartNotifyReceiver::onReceive et AutoStartNotifyReceiver::onReceive done s'écrivent bien sur la sortie standard, le problème ne semble pas venir de là.

    La classe de service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package src.updates;
     
    import android.app.AlarmManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.os.IBinder;
     
    public class UpdateService extends android.app.Service {
        final static long CHECK_INTERVAL = 60000; // en millisecondes (devrait être un ou plusieurs heures plus tard)
     
        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
     
        @Override
        public void onCreate() {
            super.onCreate();
     
            Intent intentOnAlarm = new Intent(UpdateReceiver.ACTION_PULSE_SERVER_ALARM);
            PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intentOnAlarm, 0);
     
            AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
            alarms.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + CHECK_INTERVAL, CHECK_INTERVAL, alarmIntent);
     
            System.out.println("UpdateService::onCreate() done");
        }
     
        @Override
        public void onStart(Intent intent, int startId) {
            super.onStart(intent, startId);
            System.out.println("UpdateService::onStart() done");
        }
    }
    Là aussi tout semble aller car "UpdateService::onCreate() done" et "UpdateService::onStart() done" s'affichent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package src.updates;
     
    import java.util.Date;
     
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
     
    public class UpdateReceiver extends BroadcastReceiver {
        public static final String ACTION_PULSE_SERVER_ALARM = "com.mon_dom.mon_app.ACTION_PULSE_SERVER_ALARM";
     
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("UpdateReceiver::onReceive");
        }
    }
    Là "UpdateReceiver::onReceive" ne s'affiche jamais, du moins lorsque l'on démarre le UpdateService depuis le boot car si il est lancé manuellement d'une Activity cela fonctionne très bien.


    Mon AndroidManifest.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.mon_dom.mon_app"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk
            android:minSdkVersion="4"
            android:targetSdkVersion="4" />
     
        <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
     
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
     
            <receiver android:name="src.updates.AutoStartNotifyReceiver" android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
            </receiver>
     
            <receiver android:name="src.updates.UpdateReceiver" android:label="@string/app_name">
                <intent-filter>
                    <action android:name="com.mon_dom.mon_app.ACTION_PULSE_SERVER_ALARM" />
                </intent-filter>
            </receiver>
     
            <service android:name="src.updates.UpdateService" />
        </application>
     
    </manifest>
    Remarque : c'est Android 1.6, je pense que les autorisations sont correctes, j'ai pas mis les Activity pour plus de lisibilité.

    Le message d'erreur :
    05-11 15:49:11.906: W/ActivityManager(51): Scheduling restart of crashed service com.mon_dom.mon_app/src.updates.UpdateService in 5000ms

    Sur la sortie standard aucun "UpdateReceiver::onReceive" à l'horizon, voici tout ce que j'ai dessus :
    05-11 15:49:10.056: I/System.out(176): AutoStartNotifyReceiver::onReceive
    05-11 15:49:10.106: I/System.out(176): AutoStartNotifyReceiver::onReceive done
    05-11 15:49:10.226: I/System.out(176): UpdateService::onCreate() done
    05-11 15:49:10.226: I/System.out(176): UpdateService::onStart() done

    Autre demande : peut t'on redémarrer correctement l'émulateur Android ? Pour l'instant je ne stoppe et redémarre car je n'ai pas moyen de faire autrement.

    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 164
    Points : 227
    Points
    227
    Par défaut
    J'ai trouvé l'origine du plantage, il réinstallait le .apk alors que le service démarrait ce qui le fessait planter.
    Il le faut également lorsqu'il n'y a aucun changement au programme.
    En démarrant avec "Android Virtual Device Manager" -> "Start" cela fonctionne.

    Je l'ai transféré à mon téléphone avec les vraies valeurs donc on verra dans quelques temps si c'est bon.

    Sinon je n'ai toujours pas de moyen propre d'éteindre et redémarrer l'émulateur, j'ai essayé "adb shell stop" et "adb -e reboot" mais cela le fait planter.

Discussions similaires

  1. Service qui plante dès que la connexion est perdue
    Par ZwQuery dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 02/12/2014, 10h34
  2. CreateOleObject qui plante dans un service IIS
    Par Papy214 dans le forum Langage
    Réponses: 7
    Dernier message: 09/07/2014, 15h57
  3. service qui ne démarre pas
    Par Kropernic dans le forum VB.NET
    Réponses: 7
    Dernier message: 31/05/2010, 10h27
  4. Réponses: 1
    Dernier message: 18/02/2009, 18h32
  5. Driver IDE qui plante au boot
    Par troumad dans le forum Debian
    Réponses: 4
    Dernier message: 20/04/2006, 09h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo