Android onCreate або onStartCommand для запуску служби


105

Зазвичай при створенні сервісу Android я реалізую onCreateметод, але в останньому проекті це не працює. Я спробував реалізувати onStartCommand, і це, здається, працює.

Питання: коли мені доведеться впровадити сервіс, який метод потрібен? Які методи я повинен застосувати? onCreate, onStartCommandабо обоє? І яка роль кожного?


onCreateзавжди називається незалежно
ІгорГанапольський

Відповіді:


189

onCreate()називається, коли Serviceоб'єкт інстанціюється (тобто: коли служба створена ). У цьому методі слід робити те, що вам потрібно зробити лише один раз (тобто: ініціалізувати деякі змінні тощо). onCreate()буде називатися лише один раз на об'єкт, що створюється .

Вам потрібно реалізувати лише onCreate()тоді, коли ви дійсно хочете / потрібно щось ініціалізувати лише один раз .

onStartCommand()викликається кожен раз, коли клієнт запускає послугу за допомогою startService(Intent intent). Це означає, що onStartCommand()можна дзвонити кілька разів. Ви повинні виконувати ті методи, які потрібні щоразу, коли клієнт щось вимагає від вашої послуги. Це дуже залежить від того, що робить ваша послуга та як вона спілкується з клієнтами (і навпаки).

Якщо ви не реалізуєте, onStartCommand()тоді ви не зможете отримати будь-яку інформацію з того, Intentщо передає клієнт, onStartCommand()і ваша служба може не змогти виконати корисну роботу.


6
Чи можуть у програмі існувати два екземпляри однієї Служби?
коктейлі

1
@jacktrades Теоретично і згідно з документацією: Ні. Однак, начебто, в Android є помилка, де дійсно за певних обставин це створить кілька примірників Служби. Однак, як я вже сказав, це помилка, і ми не змогли надійно її відтворити за бажанням. Чому ти запитуєш?
Девід Вассер

3
@Mr_and_Mrs_D Наскільки я не знаю, немає офіційних помилок. Однак є кілька повідомлень про це, і у мене є додаток, де я знаю, що це відбувається. Мені не вдалося зменшити проблему до чогось невеликого і повторюваного, тому я сам не подав помилку. У документації прямо не вказано, що послуги одинакові, але цілком зрозуміло, що саме це призначено. Подивіться на документи для "startService ()": чітко зазначено, що якщо служба вже не працює, вона буде створена і запущена, якщо вона запущена, вона залишається запущеною
David Wasser

6
@Diffy Коли ви телефонуєте startService(), якщо служба не працює, Android створить екземпляр класу обслуговування (це сервіс-об’єкт) і потім зателефонує onCreate()на цей об’єкт. Потім він зателефонує onStartCommand()на цей об’єкт. Якщо через деякий час ви знову зателефонуєте startService(), якщо служба все ще працює, Android не створить новий об’єкт послуги. Натомість він просто зателефонує onStartCommand()на існуючий об’єкт обслуговування. Це зрозуміло?
Девід Вассер

1
Я тебе люблю! (y) працював як магія (y) дуже просте і добре пояснення
Hilton Khadka

11

Служба поводиться так само, як активність Що б ви не хотіли associateодин раз із службою, буде входити onCreateяк ініціалізація

і кожного разу, коли serviceвикликається за допомогою startService . onStartCommandбуде називатися. і ви можете пройти будь-яку дію для виконання. наприклад, для музичного плеєра. Ви можете грати, робити паузу, припиняти використання дії

І ви робите будь- operation in serviceяку, надсилаючи дію та отримуючи її даліonStartCommand

onCreate працювати як конструктор.

Редагувати стисло

onCreate()дзвінки тільки в перший раз , ви починаєте Serviceприймаючи у увагу onStartCommand()дзвінки кожен раз, коли ви називаєте startServiceзнову. Це дозволяє вам встановити таку дію, як грати, зупиняти, призупиняти музику.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}

Тож коли я зателефоную до служби за допомогою startService (наміру), чи буде викликано onCreate ()? У мене є сумніви в розумінні, що таке "об’єкт послуги", тому що я завжди запускав службу за допомогою startSevice (наміри).
Diffy

чи правильно ви створили об'єкт обслуговування або, мабуть, у вас немає служби у своєму маніфесті
AndroidGeek

запустити службу, як startService (новий намір (це, ServiceName.class));
AndroidGeek

Але чи називається цей метод екземпляром послуги? Де тоді об’єкт служби?
Діффі

це спосіб виклику Діяльність і Сервіс за допомогою наміру відповідає за відкриття Діяльності та Сервісу в Android. Що ви хочете зробити з об’єктом обслуговування, ви можете також робити це з наміром. я маю на увазі передачу даних в Сервіс
AndroidGeek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.