Android RuntimeException: impossible d’instancier le service

Je veux créer un service qui s’exécutera sur un thread séparé (pas sur UI Thread), j’ai donc implémenté une classe qui étendra IntentService. Mais je n’ai pas de chance. Voici le code

public class MyService extends IntentService { public MyService(Ssortingng name) { super(name); // TODO Auto-generated constructor stub } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); Log.e("Service Example", "Service Started.. "); // pushBackground(); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.e("Service Example", "Service Destroyed.. "); } @Override protected void onHandleIntent(Intent arg0) { // TODO Auto-generated method stub for (long i = 0; i <= 1000000; i++) { Log.e("Service Example", " " + i); try { Thread.sleep(700); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 

Service Consumption dans un bouton d’activité, cliquez sur:

 public void onclick(View view) { Intent svc = new Intent(this, MyService.class); startService(svc); } 

Dans votre implémentation concrète, vous devez déclarer un constructeur par défaut qui appelle le super constructeur public IntentService (Ssortingng name) de la classe abstraite IntentService que vous étendez:

 public MyService () { super("MyServerOrWhatever"); } 

Vous n’avez pas besoin d’écraser onStartCommand si la super implémentation vous convient (ce que j’attends).

Dans votre cas actuel, vous devriez obtenir une exception (Impossible d’instancier le service …) – cela vaut toujours la peine de le mettre dans la question.

Ce n’est pas le cas ici, mais cela pourrait aider quelqu’un: vérifiez que votre classe de service n’est pas abstraite . J’ai eu ce problème parce que j’avais copié l’implémentation d’IntentService à partir du SDK et l’ai modifié pour mieux répondre à mes besoins.

J’ai résolu le problème “Impossible d’instancier le service” en ajoutant le constructeur sans paramètre par défaut.

ServiceDemo.java:

 public class ServicesDemo extends Activity implements OnClickListener { private static final Ssortingng TAG = "ServicesDemo"; Button buttonStart, buttonStop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); buttonStart = (Button) findViewById(R.id.buttonStart); buttonStop = (Button) findViewById(R.id.buttonStop); buttonStart.setOnClickListener(this); buttonStop.setOnClickListener(this); } public void onClick(View src) { switch (src.getId()) { case R.id.buttonStart: Log.w(TAG, "onClick: starting srvice"); startService(new Intent(this, MyService.class)); startActivity(new Intent(getApplicationContext(),Second.class)); break; case R.id.buttonStop: Log.w(TAG, "onClick: stopping srvice"); stopService(new Intent(this, MyService.class)); break; } } } 

MyService.java:

 package com.example; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class MyService extends Service { private static final Ssortingng TAG = "MyService"; MediaPlayer player; @Override public IBinder onBind(Intent intent) { Log.w(" ibinder ",""); return null; } @Override public void onCreate() { Toast.makeText(this, "My Service Created",0).show(); Log.w(TAG, "onCreate"); player = MediaPlayer.create(this,R.raw.frm7v1); player.setLooping(true); // Set looping } @Override public void onDestroy() { Toast.makeText(this, "My Service Stopped",0).show(); Log.w(TAG, "onDestroy"); player.stop(); } @Override public void onStart(Intent intent, int startid) { Toast.makeText(this, "My Service Started :"+intent+" start id :"+startid,0).show(); Log.d(TAG, "onStart"); player.start(); } } 

Déclarez l’atsortingbut suivant dans le fichier manifeste:

   

Cette réponse a été mise à jour. Voici la réponse correcte mise à jour:

Selon la documentation que vous n’avez pas besoin de remplacer onStartCommand () pour IntentServices, la documentation à la place dit à propos de onStartCommand () pour IntentServices: Vous ne devez pas remplacer cette méthode pour votre IntentService. Au lieu de cela, remplacez onHandleIntent (Intent), que le système appelle lorsque IntentService reçoit une demande de démarrage. (Merci à Ready4Android).


Ci-dessous, la réponse incorrecte originale (laissée dans les commentaires):

Selon la documentation, vous devez remplacer OnStartCommand () (ou OnStart () obsolète) pour traiter le démarrage du service d’intention. L’as tu essayé? Et comme l’écrit K. Claszen , vous devez implémenter un constructeur par défaut.