web-dev-qa-db-fra.com

Android RuntimeException: impossible d'instancier le service

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);
}
45
ram

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.

65
FrVaBe

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.

3
Juuso Ohtonen

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" />
1
sravan

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

1
Mohsen Afshin

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

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.

1
Audrius