Может ли IntentService работать бесконечно?

Насколько я понимаю, IntentService будет остановлен, когда его текущий запрос будет выполнен.

Рассмотрим приведенный ниже сценарий: я буду запускать запрос к IntentSerivce каждые 100 мс, а время обработки этого запроса составит 90 мс.

Таким образом, для каждого моего запроса - вызов startSerivce, служба будет вызываться, и через 90 мс (после завершения обработки) будет вызываться onDestroy IntentServicee.

Я хотел бы, чтобы этот IntentServicee работал, пока я не скажу «стоп». Это возможно?

предположим, что я собираюсь сделать следующее в своем сервисе

  1. Настройте его
  2. Отправить запрос
  3. ждать ответа
  4. прочитать ответ
  5. Трансляция активности, которая вызвала

Шаги 1 являются общими для всех моих запросов, поэтому я подумал, что могу выполнить их, когда служба запускается сначала один раз, а затем выполнять 3-6 в HandleIntent на основе запросов.


person Pathy    schedule 27.07.2011    source источник


Ответы (4)


IntentService на самом деле довольно маленький класс, который обертывает Handler, проблема в том, что после обработки Intent он вызывает stopSelf().

Удаление этой единственной строки дает вам IntentService, который необходимо явно остановить:

public abstract class NonStopIntentService extends Service {

    private String mName;
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;

    public NonStopIntentService(String name) {
        super();
        mName = name;
    }

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            // stopSelf(msg.arg1); <-- Removed
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return START_STICKY;
    }    

    @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    /**
     * This method is invoked on the worker thread with a request to process.
     * Only one Intent is processed at a time, but the processing happens on a
     * worker thread that runs independently from other application logic.
     * So, if this code takes a long time, it will hold up other requests to
     * the same IntentService, but it will not hold up anything else.
     *
     * @param intent The value passed to {@link
     *               android.content.Context#startService(Intent)}.
     */
    protected abstract void onHandleIntent(Intent intent);  

}
person Graeme    schedule 30.03.2012

IntentService расширен из стандартного класса Service, поэтому я не понимаю, почему это нельзя сделать таким образом. На самом деле я тоже так сделаю. ;)

person SilverGhost    schedule 05.11.2011

Если у вас не так много работы в службе, вы можете просто продлить обычную службу. Возвращайте null в onBind() и получайте команды в onStartCommand(), который возвращает START_STICKY.

person Moritz    schedule 25.01.2015

Вам нужно создать Service и bind для вашей службы, чтобы предотвратить ее остановку. См. документацию.

Служба, которая будет запущена с bindService(), будет работать до тех пор, пока к ней не будет привязано ни одно действие.

person Ovidiu Latcu    schedule 27.07.2011
comment
Вы имеете в виду, что bindService нельзя сделать с помощью IntentService? Нужно ли расширять Service вместо IntentService? - person Pathy; 27.07.2011
comment
Я не уверен насчет IntentService... но я думаю, что он тоже может работать. Я никогда не пробовал это, хотя. - person Ovidiu Latcu; 27.07.2011
comment
Мне удалось связать действие с IntentService. Кажется, он работает нормально. OnDestroy IntentService вызывается, когда я говорю «отвязать». Но я просто хотел убедиться, разрешено ли это в Android (привязка к IntentService)? У вас есть какая-либо информация, связанная с этим? Я был бы очень признателен за ваш вклад. - person Pathy; 28.07.2011