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 и изменил ее, чтобы лучше соответствовать моим потребностям.