Android RuntimeException: Impossible d'instancier le service
-
14-11-2019 - |
Question
Je souhaite créer un service qui s'exécutera sur un thread séparé (pas sur le thread d'interface utilisateur), j'ai donc implémenté une classe qui étendra Investervice. Mais je n'ai pas de chance. Voici le code.
public class MyService extends IntentService {
public MyService(String 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();
}
}
}
}
Consommation de service dans un bouton d'activité Cliquez:
public void onclick(View view) {
Intent svc = new Intent(this, MyService.class);
startService(svc);
}
La solution
Dans votre implémentation concrète, vous devez déclarer un constructeur par défaut qui appelle le public IntentService (String name)
Super constructeur de la classe Abstract IntenteService 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 (incapable de instancier un service ...) - il vaut toujours la peine de le poser dans la question.
Autres conseils
Pas le cas ici, mais cela pourrait aider quelqu'un: vérifier que votre service La classe n'est pas abstraite. J'ai eu ce problème parce que j'avais copié la mise en œuvre de l'intention du SDK et l'avais modifiée pour mieux répondre à mes besoins.
J'ai résolu le problème "incapable 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 String 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 String 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'attribut suivant dans le fichier manifeste:
<service android:enabled="true" android:name=".MyService" />
Cette réponse a été mise à jour. Voici la réponse correcte mise à jour:
Selon la documentation, vous n'avez pas à remplacer OnStartCommand () pour Intentservices, la documentation indique plutôt ce qui suit sur OnStartCommand () pour IntenServices: vous ne devez pas remplacer cette méthode pour votre InterService. Au lieu de cela, remplacer OnHandlentent (INTING), que le système appelle lorsque l'interService reçoit une demande de démarrage. (Merci à Ready4Android).
Vous trouverez ci-dessous la réponse incorrecte originale (laissée afin que les commentaires aient un sens):
Selon Documentation Vous devez remplacer ONStartCommand () (ou déconcentré OnStart ()) afin de traiter le démarrage du service INTERNE. L'as tu essayé? Et comme K. Claszen écrit - vous devez implémenter le constructeur par défaut.