Android – Démarrer le service au démarrage

D’après tout ce que j’ai vu sur Stack Exchange et ailleurs, tout est configuré correctement pour démarrer IntentService lorsque le système d’exploitation Android démarre. Malheureusement, il ne démarre pas au démarrage et je ne reçois aucune erreur. Peut-être que les experts peuvent aider …

Manifeste:

               

BroadcastReceiver pour le démarrage:

 package com.phx.batterylogger; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class StartupIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent serviceIntent = new Intent(context, BatteryLogger.class); context.startService(serviceIntent); } } 

MISE À JOUR : J’ai essayé à peu près toutes les suggestions ci-dessous, et j’ai ajouté la journalisation telle que Log.v("BatteryLogger", "Got to onReceive, about to start service"); au gestionnaire onReceive de StartupIntentReceiver, et rien n’est jamais enregistré. Donc, il ne va même pas au BroadcastReceiver.

Je pense que je déploie l’APK et que je teste correctement, exécutant simplement Debug dans Eclipse et que la console dit qu’elle l’installe avec succès sur ma tablette Xoom à \ BatteryLogger \ bin \ BatteryLogger.apk. Ensuite, pour tester, je redémarre la tablette, puis examine les journaux dans DDMS et vérifie les services en cours d’exécution dans les parameters du système d’exploitation. Est-ce que tout cela semble correct ou est-ce que je manque quelque chose? Encore une fois, toute aide est très appréciée.

Eh bien voici un exemple complet d’une application AutoStart

Fichier AndroidManifest

              

autostart.java

 public class autostart extends BroadcastReceiver { public void onReceive(Context context, Intent arg1) { Intent intent = new Intent(context,service.class); context.startService(intent); Log.i("Autostart", "started"); } } 

service.java

 public class service extends Service { private static final Ssortingng TAG = "MyService"; @Override public IBinder onBind(Intent intent) { return null; } public void onDestroy() { Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); Log.d(TAG, "onDestroy"); } @Override public void onStart(Intent intent, int startid) { Intent intents = new Intent(getBaseContext(),hello.class); intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intents); Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); Log.d(TAG, "onStart"); } } 

hello.java – Cela apparaîtra à chaque fois que vous démarrez le périphérique après avoir exécuté l’application une fois.

 public class hello extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Toast.makeText(getBaseContext(), "Hello........", Toast.LENGTH_LONG).show(); } } 

La suite devrait fonctionner. J’ai vérifié Peut-être que votre problème est ailleurs.

 public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Log.d("TAG", "MyReceiver"); Intent serviceIntent = new Intent(context, Test1Service.class); context.startService(serviceIntent); } } public class Test1Service extends Service { /** Called when the activity is first created. */ @Override public void onCreate() { super.onCreate(); Log.d("TAG", "Service created."); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("TAG", "Service started."); return super.onStartCommand(intent, flags, startId); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.d("TAG", "Service started."); } @Override public IBinder onBind(Intent arg0) { return null; } }                  

Votre service est peut-être en train de s’éteindre avant la fin du traitement, car le périphérique s’endort après le démarrage. Vous devez d’abord obtenir un verrou de réveil. Heureusement, la bibliothèque de support nous donne une classe pour le faire:

 public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // This is the Intent to deliver to our service. Intent service = new Intent(context, SimpleWakefulService.class); // Start the service, keeping the device awake while it is launching. Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); startWakefulService(context, service); } } 

puis, dans votre service, assurez-vous de libérer le verrou de veille:

  @Override protected void onHandleIntent(Intent intent) { // At this point SimpleWakefulReceiver is still holding a wake lock // for us. We can do whatever we need to here and then tell it that // it can release the wakelock. ... Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime()); SimpleWakefulReceiver.completeWakefulIntent(intent); } 

N’oubliez pas d’append la permission WAKE_LOCK:

   

Ressemble beaucoup au mien mais j’utilise le nom complet du paquet pour le récepteur:

  

J’ai:

  

J’ai eu du succès sans le package complet, savez-vous où la chaîne d’appels est interrompue? Si vous déboguez avec Log() , à quel moment ne fonctionne-t-il plus?

Je pense que cela peut être dans votre IntentService, tout cela va bien.

Juste pour faciliter la recherche, comme mentionné dans les commentaires, ce n’est pas possible depuis 3.1 https://stackoverflow.com/a/19856367/6505257