Должен ли я использовать службу намерений?

У меня есть экран входа пользователя. Пользователь нажимает кнопку входа, и я создаю IntentService для подключения к остальным службам и возврата результата аутентификации.

Теперь вот функциональность, которую я хочу достичь: если действие приостановлено (т. е. переходит в фоновый режим), служба намерений все еще должна работать, и она работает. Но если я использую диспетчер задач, чтобы убить приложение, служба намерений должна остановиться, хотя сейчас это не так. Он продолжает выполнение onHandleIntent до завершения. Если я вручную вызываю stopSelf(), вызывается onDestroy(), но метод onHandleIntent продолжает выполняться. Как заставить onHandleIntent остановиться? Вызов «return» не вариант, потому что он может быть перехвачен одним вызовом метода rest.

Должен ли я использовать службу намерений для этой функции или что-то еще (например, службу или асинтаск)?


person MobileMon    schedule 29.02.2012    source источник


Ответы (2)


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

Я не уверен, почему "обратный вызов" не вариант для вас? Под этим я предполагаю, что вы имеете в виду проверку условия и выход из цикла или блока, если условие выполняется. Обычно так должны заканчиваться потоки (в службах или где-либо еще) (хотя есть и другие подходы). Поток вашей службы может прослушивать определенное событие, которое произошло (например, если действие было уничтожено, установив свойство в файле или базе данных при вызове действия onDestroy, хотя, если это то, что вы хотите, вам, вероятно, НЕ следует использовать a Service), а затем run() может корректно вернуться.

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

Может быть, если бы вы могли лучше определить, когда вы хотите, чтобы эта служба была остановлена?

person ubzack    schedule 29.02.2012
comment
Я хочу, чтобы IntentService был остановлен только в том случае, если действие, вызвавшее его, уничтожено. IntentService должен продолжать выполняться, если действие, создавшее его, приостановлено (что в настоящее время и происходит). Вызов stopSelf() для службы при уничтожении действия действительно вызывает метод onDestroy для службы, но onHandleIntent продолжает выполняться, он никогда не останавливается. - person MobileMon; 29.02.2012
comment
Если вы хотите, чтобы задача остановилась, если действие было уничтожено, я бы не стал использовать службу. Я бы использовал поток, который выполняет код в вашем методе onHandleIntent. Вы можете убить поток вручную или (что я рекомендую) вы можете прослушивать условие, установленное в вызове onDestroy вашей активности. Обычно у меня есть статическое логическое значение isLive, которое я устанавливаю в значение true в onCreate и false в onDestroy, и оно обычно работает для этой цели. - person ubzack; 29.02.2012
comment
Милый чувак, спасибо, это именно тот ответ, который я искал! - person MobileMon; 29.02.2012

остановите это в своем методе onDestroy()

person Royi    schedule 29.02.2012
comment
Как? onDestroy() вызывается, но как остановить метод onHandleIntent() из onDestroy()? - person MobileMon; 29.02.2012