Android RuntimeException: невозможно создать экземпляр службы - PullRequest
45 голосов
/ 17 февраля 2011

Я хочу создать сервис, который будет работать в отдельном потоке (не в потоке пользовательского интерфейса), поэтому я реализовал класс, который расширит 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);
}

Ответы [ 5 ]

65 голосов
/ 17 февраля 2011

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

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

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

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

2 голосов
/ 02 декабря 2013

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

1 голос
/ 01 июля 2012

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

1 голос
/ 04 октября 2011

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" />
1 голос
/ 17 февраля 2011

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

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


Ниже приведен первоначальный неправильный ответ (оставленный в комментариях):

Согласно документации Вы должны переопределить OnStartCommand () (или устареть OnStart ()) для обработки намеренного запуска службы.Ты это пробовал?А так же К.Claszen писал - нужно реализовать конструктор по умолчанию.

...