Service.onStartCommand() - можно ли вернуть более одного флага?

Я должен убедиться, что мой Service будет работать, пока я явно не вызову stopService(). поэтому я должен вернуть из onStartCommand() флаг START_STICKY.

также я хочу, чтобы в случае, если моя служба будет уничтожена системой из-за нехватки памяти, когда система будет ее воссоздавать, onStartCommand() будет вызываться с тем же намерением, что изначально запустил службу. потому что по этой причине я хотел бы использовать флаг START_FLAG_REDELIVERY. то, что я описал, наверняка может произойти (и действительно произошло со мной) в соответствии с документацией - http://developer.android.com/reference/android/app/Service.html#ProcessLifecycle

Я знаю, что могу запустить службу с startForground(), что не позволяет службе быть кандидатом на уничтожение системой при нехватке памяти, но я предпочитаю не использовать этот подход, и в любом случае - согласно документации: система все еще может его убить при крайне низкой нагрузке на память.

так что было бы идеально, если бы я мог вернуться из onStartCommand() START_STICKY|START_FLAG_REDELIVERY

но по документации вроде можно использовать только один из флагов (может я ошибаюсь??).

так можно ли как-то запустить сервис, который будет работать так, как я описал?


person Tal Kanel    schedule 12.10.2012    source источник


Ответы (2)


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

person waqaslam    schedule 12.10.2012
comment
Я знаю, что могу реализовать такую ​​логику, но мой вопрос в том, можно ли запустить службу, как я описываю, без таких трюков. - person Tal Kanel; 12.10.2012
comment
вы не можете вернуть несколько значений, и этот метод не является хаком или ярлыком :) - person waqaslam; 12.10.2012
comment
в любом случае - я не могу использовать общие настройки, потому что то, что я передаю в намерении, является экземпляром Messenger - person Tal Kanel; 13.10.2012
comment
Это возможно. Поскольку Messenger реализует Parcelable, вы можете легко преобразовать его в байты с помощью writeToParcel, а затем marshall из возвращенного Parcel. Во всяком случае, это было мое предложение, так что все зависит от того, как вы хотите достичь. - person waqaslam; 13.10.2012
comment
спасибо за ваше предложение, я думаю, что я сохраню мессенджер так, как вы описали, или другим способом. Я хочу исключить ваш ответ, но мне все еще не хватает ответа на простой вопрос, возможно или нет запускать липкую службу + будет выполнять то же намерение, если система перезапустит. вы почти написали это в комментарии, за который я проголосовал. если вы знаете, что такого нет - отредактируйте свой ответ, и я буду рад его исключить. - person Tal Kanel; 13.10.2012

насколько я помню, разница между START_STICKY и START_FLAG_REDELIVERY заключается в том, что он будет повторно доставлен с нулевым намерением или снова с тем же намерением. Это просто то, как вы хотите это запрограммировать. Вы должны вернуть только один флаг, потому что это разные режимы работы.

person Budius    schedule 12.10.2012
comment
вы уверены в? потому что это не то, что можно понять из документации. - person Tal Kanel; 12.10.2012
comment
Я могу ошибаться, но это то, что я понимаю из документов. Оба будут перезапущены позже, если система должна их убить. Один будет перезапущен без намерения (null), а другой будет перезапущен с повторной доставкой того же намерения. - person Budius; 12.10.2012
comment
да, но START_NOT_STICKY или START_REDELIVER_INTENT используются для служб, которые должны работать только во время обработки отправленных им команд. Мне нужно, чтобы мой сервис оставался в фоновом режиме, если какое-то время никто не отправлял ему команду. - person Tal Kanel; 12.10.2012
comment
никто ничего не сказал о NOT_STICK, который является другим. Система Android не гарантирует, что какая-либо служба будет работать всегда. лучшее, что он может сделать, это попросить перезапустить его. Может, стоит попробовать другой подход? Вы можете использовать диспетчер аварийных сигналов, чтобы время от времени запускать свою службу, или создать учетную запись в диспетчере учетных записей и создать всю схему синхронизации (но это гораздо более сложный вариант). И я перечитываю ваш вопрос, возвращаясь к исходной точке, я думаю, вы хотите START_FLAG_REDELIVERY. - person Budius; 12.10.2012