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);
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top