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

106

Обычно, когда я создаю службу Android, я реализую этот onCreateметод, но в моем последнем проекте это не работает. Я пробовал реализовать onStartCommand, и, похоже, это сработало.

Возникает вопрос: когда мне нужно реализовать услугу, какой метод потребуется? Какие методы мне нужно реализовать? onCreate, onStartCommandили оба? И какова роль каждого?

GVillani82
источник
onCreateвсегда называется независимо
Игорь Ганапольский

Ответы:

189

onCreate()вызывается при создании Serviceэкземпляра объекта (т.е. когда услуга создана ). В этом методе вы должны делать то, что вам нужно сделать только один раз (например, инициализировать некоторые переменные и т. Д.). onCreate()будет вызываться только один раз для каждого экземпляра объекта .

Вам нужно только реализовать, onCreate()если вы действительно хотите / нужно что-то инициализировать только один раз .

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

Если вы не реализуете его, onStartCommand()вы не сможете получить какую-либо информацию от Intentклиента, onStartCommand()и ваша служба не сможет выполнять какую-либо полезную работу.

Дэвид Вассер
источник
6
Могут ли в приложении существовать два экземпляра одной и той же службы?
jacktrades
1
@jacktrades Теоретически и согласно документации: Нет. Однако, похоже, есть некоторая ошибка в Android, где действительно при определенных обстоятельствах он создает несколько экземпляров Сервиса. Однако, как я уже сказал, это ошибка, и мы не смогли надежно воспроизвести ее по своему желанию. Почему ты спрашиваешь?
Дэвид Вассер
3
@Mr_and_Mrs_D Насколько мне известно, официальных сообщений об ошибках не поступало. Однако есть несколько сообщений об этом, и у меня есть приложение, в котором я знаю, что это происходит. Мне не удалось свести проблему к чему-то небольшому и повторяемому, поэтому я сам не сообщал об ошибке. В документации не указано явно, что сервисы являются одиночными, но совершенно ясно, что это то, что предполагается. Посмотрите документацию для startService (): четко указано, что, если служба еще не запущена, она будет создана и запущена, если она запущена, она останется работающей
Дэвид Вассер
6
@Diffy При вызове startService(), если служба не запущена, Android создаст экземпляр класса службы (это объект службы), а затем вызовет onCreate()этот объект. Затем он вызовет onStartCommand()этот объект. Если через некоторое время вы снова позвоните startService(), если служба все еще работает, Android не создаст новый объект службы. Вместо этого он просто вызовет onStartCommand()существующий объект службы. Это ясно?
Дэвид Вассер
1
Я тебя люблю! (y) сработало как по волшебству (y) очень простое и хорошее объяснение
Hilton
11

Служба ведет себя так же, как Activity. Все, что вы хотите 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")
     {}
}
AndroidGeek
источник
Итак, когда я вызываю службу с помощью startService (intent), не будет ли вызываться onCreate ()? Я сомневаюсь, что понимаю, что такое «объект службы», потому что я всегда запускал службу с помощью startSevice (намерение).
Diffy
правильно ли вы создали экземпляр объекта службы или, возможно, у вас нет службы в вашем манифесте
AndroidGeek
запустить службу, например startService (новое намерение (this, ServiceName.class));
AndroidGeek
Но называется ли этот метод созданием экземпляра службы? Где тогда сервис-объект?
Diffy
это способ вызова Activity и Service с использованием намерения, отвечающего за открытие Activity и Service в Android. То, что вы хотите делать с объектом обслуживания, вы также можете делать намеренно. я имею в виду передачу данных в Сервис
AndroidGeek