saber - Android RuntimeException: no se puede crear una instancia del servicio
intentservice vs service (5)
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);
}
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 documentation , 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.
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:
<service android:enabled="true" android:name=".MyService" />