Android RuntimeException: no se puede crear una instancia del servicio

Quiero crear un servicio que se ejecutará en un hilo separado (no en el subproceso UI), así que implementé una clase que extenderá IntentService. Pero no he tenido suerte. Aquí está el código.

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(); } } } } 

Consumo de servicio en un botón de actividad, haga clic en:

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

En su implementación concreta, debe declarar un constructor predeterminado que llame al constructor súper public IntentService (String name) de la clase abstracta IntentService que amplía:

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

No necesita sobreescribir onStartCommand si la implementación supera para usted (lo que espero).

En su caso actual, debe obtener una excepción (no se puede crear una instancia del servicio …): siempre vale la pena incluir esto en la pregunta.

No es el caso aquí, pero esto podría ayudar a alguien: verifique que su clase de servicio no sea abstracta . Tuve este problema porque había copiado la implementación de IntentService de SDK y la modifiqué para adaptarla mejor a mis necesidades.

Resolví el problema “No se pudo crear una instancia del servicio”, al agregar el constructor sin parámetros predeterminado.

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(); } } 

Declare el siguiente atributo en el archivo de manifiesto:

   

Esta respuesta ha sido actualizada. Aquí está la respuesta correcta y actualizada:

De acuerdo con la documentación, no es necesario anular onStartCommand () para IntentServices, sino que la documentación dice lo siguiente sobre onStartCommand () para IntentServices: No debe anular este método para su IntentService. En cambio, anule onHandleIntent (Intención), que el sistema llama cuando IntentService recibe una solicitud de inicio. (Gracias a Ready4Android).


A continuación se encuentra la respuesta incorrecta original (a la izquierda para que los comentarios tengan sentido):

De acuerdo con la documentación , debe anular OnStartCommand () (o desaprobado OnStart ()) para procesar el inicio del servicio intencionado. ¿Lo has probado? Y como escribió K. Claszen , debe implementar el constructor predeterminado.