Подтвердить что ты не робот

StopSelf() vs stopSelf (int) vs stopService (Intent)

Какая разница в звонках stopSelf(), stopSelf(int) или stopService(new Intent(this,MyServiceClass.class))
внутри onStartCommand()?

например, если я дважды запускаю те же службы:

...
Intent myIntent1 = new Intent(AndroidAlarmService.this, MyAlarmService.class);
myIntent1.putExtra("test", 1); 
Intent myIntent2 = new Intent(AndroidAlarmService.this, MyAlarmService.class);
myIntent2.putExtra("test", 2);
startService(myIntent1);
startService(myIntent2);
...

И реализуйте onStartCommand таким образом:

public int onStartCommand(Intent intent, int flags, int startId)
{
Toast.makeText(this, "onStartCommand called "+intent.getIntExtra("test", 0), Toast.LENGTH_LONG).show();
stopService(new Intent(this,MyAlarmService.class));
return START_NOT_STICKY;
}

Я получаю точно такое же поведение с тремя методами, то есть onDestroy вызывается только после того, как onStartCommand выполняется дважды.

4b9b3361

Ответ 1

Надеюсь, это поможет вам:

Начальный сервис должен управлять собственным жизненным циклом. То есть система не останавливает или не уничтожает службу, если она не должна восстанавливать системную память, и служба продолжает работать после возвращения onStartCommand(). Таким образом, служба должна остановить себя, вызвав stopSelf(), или другой компонент может остановить ее, вызвав stopService().

После того как вы запросили остановиться с stopSelf() или stopService(), система как можно скорее уничтожит службу.

Однако, если ваша служба обрабатывает несколько запросов к onStartCommand() одновременно, то вы не должны останавливать службу, когда вы закончите обработку запроса на запуск, потому что с тех пор вы могли получить новый запрос на запуск (остановка в конце первого запроса прекратит второй). Чтобы избежать этой проблемы, вы можете использовать stopSelf (int), чтобы гарантировать, что ваш запрос на остановку службы всегда основывается на самом последнем запросе на запуск.

То есть, когда вы вызываете stopSelf (int), вы передаете идентификатор запроса на запуск (startId доставляется на onStartCommand()), которому соответствует ваш запрос на остановку. Затем, если служба получила новый запрос на запуск до того, как вы смогли вызвать stopSelf (int), тогда идентификатор не будет соответствовать, и служба не остановится.

Ответ 2

Вот упрощенное описание:

  • stopSelf() используется, чтобы всегда останавливать текущий сервис.

  • stopSelf(int startId) также используется для остановки текущей службы, но только если startId был идентификатором, указанным при последнем запуске службы.

  • stopService(Intent service) используется для остановки служб, но из- за пределов службы должна быть остановлена.

Это справочная страница.

Ответ 3

Основная функциональность всех трех методов одинакова и почему они имеют похожие имена. Между ними есть очень небольшие различия.

  • public final void stopSelf()

Класс: относится к классу android.app.Service

Вызывается из: этот метод предназначен для вызова только внутри службы.

Поведение: Служба остановится. onDestroy().

  • public final void stopSelf (int startId)

Класс: относится к классу android.app.Service

Вызывается из: этот метод предназначен для вызова только внутри службы.

Поведение: существует метод из старой версии stopSelfResult (int startId). Этот метод является более новой версией этого метода. Сервис будет остановлен только, если в самое последнее время он был запущен, был startId. onDestroy().

Возможно, этот метод может оказаться полезным только в случае, когда вы запустили 2-3 экземпляра одной и той же службы, но вы хотите остановить их в том порядке, в котором вы получили список startId, хранящийся у вас. При использовании этого метода нужно быть очень осторожным.

  • public abstract boolean stopService (услуга Intent)

Класс: относится к классу android.content.Context

Вызывается из: этот метод предназначен для вызова из-за пределов службы, хотя вам разрешено звонить изнутри.

Поведение. Если служба не запущена, ничего не происходит. В противном случае он будет остановлен. Обратите внимание, что вызовы startService() не учитываются - это останавливает службу независимо от того, сколько раз она была запущена. onDestroy().

Ответ 4

stopService() вызывается из класса, из которого запускается Служба. stopSelf() вызывается в текущем классе службы, чтобы остановить службу

Ответ 5

stopSelf() = Остановить службу, если она была ранее запущена.

stopSelf (int startId) = старая версия stopSelfResult (int), которая не верните результат.

stopSelfResult (int startId) = Остановить службу, если последнее время он был запущен, был startId.Its возвращает логический результат.

Ответ 6

Есть два варианта stopSelf(). Один принимает параметр startId, чтобы указать, что вы выполнили работу над одной конкретной командой, и поэтому служба должна оппортунизировать, если нет других выдающихся команд.

Ответ 7

stopSelf (int) - который используется для остановки самого последнего запуска службы на основе onStartCommand (Intent i, int f, int startid) int startid.

stopSelf() - который вызывается самой службой, когда задача завершена.

stopService (Intent) - который явно вызывается из действия, чтобы остановить службу.