Je veux 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 IntentService. 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 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 (String 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 mettre cela en question.
Ce n'est pas le cas ici mais cela pourrait aider quelqu'un: Vérifiez que votre service la classe n'est pas abstraite. J'ai eu ce problème car j'avais copié l'implémentation d'IntentService à partir du SDK et l'avais modifiée pour mieux répondre à mes besoins.
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" />
J'ai résolu le problème "Impossible d'instancier le service" en ajoutant le constructeur sans paramètre par défaut.
Selon la documentation, vous n'avez pas à remplacer onStartCommand () pour IntentServices, mais la documentation indique ce qui suit à propos de onStartCommand () pour IntentServices: vous ne devez pas remplacer cette méthode pour votre IntentService. Au lieu de cela, substituez onHandleIntent (Intent), que le système appelle lorsque IntentService reçoit une demande de démarrage. (Merci à Ready4Android).
Ci-dessous se trouve la réponse incorrecte d'origine (à gauche pour que les commentaires aient un sens):
Selon documentation , vous devez remplacer OnStartCommand () (ou obsolète OnStart ()) afin de traiter le démarrage intentionnel du service. L'as tu essayé? Et comme K. Claszen l'a écrit - vous devez implémenter le constructeur par défaut.