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

Solutions Collecting From Web of "Android RuntimeException: невозможно создать экземпляр службы"

В вашей конкретной реализации вы должны объявить конструктор по умолчанию, который вызывает public IntentService (String name) абстрактного класса IntentService, который вы расширяете:

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

Вам не нужно перезаписывать onStartCommand, если супер-реализация подходит вам (что я ожидаю).

В вашем текущем случае вы должны получить исключение (Невозможно создать экземпляр службы …) – всегда стоит поставить это в вопрос.

Я решил проблему «Не удалось создать экземпляр службы», добавив конструктор без параметров без параметров.

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

Этот ответ был обновлен. Вот обновленный, правильный ответ:

В соответствии с документацией вам не нужно переопределять onStartCommand () для IntentServices, вместо этого в документации говорится о onStartCommand () для IntentServices: вы не должны переопределять этот метод для вашего IntentService. Вместо этого переопределите onHandleIntent (Intent), который система вызывает, когда IntentService получает запрос на запуск. (Спасибо Ready4Android).


Ниже приведен оригинальный неправильный ответ (слева, поэтому комментарии имеют смысл):

В соответствии с документацией вы должны переопределить OnStartCommand () (или устаревший OnStart ()), чтобы запустить запуск службы запуска. Ты это пробовал? И, как писал К. Классен, вам нужно реализовать конструктор по умолчанию.

Здесь не так, но это может помочь кому-то: убедитесь, что ваш класс обслуживания не является абстрактным . У меня была эта проблема, потому что я скопировал реализацию IntentService из SDK и изменил ее, чтобы лучше соответствовать моим потребностям.