Android RuntimeException: невозможно создать экземпляр службы
Я хочу создать службу, которая будет работать в отдельном потоке (а не в потоке пользовательского интерфейса), поэтому я реализовал класс, который расширяет IntentService. Но мне не повезло. Вот код.
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();
}
}
}
}
Потребление сервиса в кнопке активности нажмите:
public void onclick(View view) {
Intent svc = new Intent(this, MyService.class);
startService(svc);
}
Ответы
Ответ 1
В вашей конкретной реализации вы должны объявить конструктор по умолчанию, который вызывает супер конструктор public IntentService (String name)
абстрактного класса IntentService, который вы расширяете:
public MyService () {
super("MyServerOrWhatever");
}
Вам не нужно перезаписывать onStartCommand, если супер-реализация подходит вам (что я ожидаю).
В вашем текущем случае вы должны получить исключение (Невозможно создать экземпляр службы...) - всегда стоит поставить это в вопрос.
Ответ 2
Этот ответ был обновлен. Вот обновленный, правильный ответ:
В соответствии с документацией вам не нужно переопределять onStartCommand() для IntentServices, вместо этого в документации говорится о onStartCommand() для IntentServices: вы не должны переопределять этот метод для вашего IntentService. Вместо этого переопределите onHandleIntent (Intent), который система вызывает, когда IntentService получает запрос на запуск. (Благодаря Ready4Android).
Ниже приведен оригинальный неправильный ответ (слева, поэтому комментарии имеют смысл):
В соответствии с документацией вы должны переопределить OnStartCommand() (или устаревший OnStart()), чтобы запустить запуск сервиса запуска. Ты это пробовал? И как K. Claszen написал - вам нужно реализовать конструктор по умолчанию.
Ответ 3
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();
}
}
Объявите следующий атрибут в файле манифеста:
<service android:enabled="true" android:name=".MyService" />
Ответ 4
Я решил проблему "Не удалось создать экземпляр службы", добавив конструктор без параметров без параметров.
Ответ 5
Не здесь, но это может помочь кому-то:
Убедитесь, что ваш класс обслуживания не является абстрактным. У меня была эта проблема, потому что я скопировал реализацию IntentService из SDK и изменил ее, чтобы лучше соответствовать моим потребностям.