Android: служба останавливается, когда активность закрыта - PullRequest
8 голосов
/ 23 ноября 2010

Если я правильно понимаю, bindService () с BIND_AUTO_CREATE запустит службу и не умрет, пока все привязки не будут развязаны.

Но если я включу bindService (BIND_AUTO_CREATE) в onCreate () и нажму кнопку назад, чтобы закрыть активность, сервис вызывает onDestroy () и тоже умирает.

Я не вызываю unbind () в любое время. Так значит ли это, что когда действие было уничтожено, привязка также была уничтожена, а служба также уничтожена?

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

Если я вызову StartService () и затем bindService () в onCreate (), он будет перезапускать службу при каждом запуске Activity. (Чего я не хочу).

То есть я мог бы запустить службу один раз, а затем связать при следующем запуске?

Ответы [ 3 ]

9 голосов
/ 23 ноября 2010

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

startService будет следить за тем, чтобы служба работала, даже если ваша деятельность уничтожена (если она не остановлена ​​из-за ограничений памяти).Когда вы вызываете startService, в службе вызывается метод onStart.Он не перезапускает (завершает и запускает снова) службу.Так что это зависит от того, как вы реализуете метод onStart в Сервисе.Служба onCreate, однако, вызывается только один раз, поэтому вы можете инициализировать ее там.

5 голосов
/ 19 марта 2015

Я нашел решение!

Проблема в том, что когда вы закрываете свою деятельность, а ваша служба не настроена в качестве службы переднего плана, система Android распознает ее как неиспользованную и закрывает ее.

вот пример, где я добавил уведомление:

void setUpAsForeground(String text) {
    PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0,
            new Intent(getApplicationContext(), MainActivity.class),
            PendingIntent.FLAG_UPDATE_CURRENT);
    mNotification = new Notification();
    mNotification.tickerText = text;
    mNotification.icon = R.drawable.muplayer;
    mNotification.flags |= Notification.FLAG_ONGOING_EVENT;
    mNotification.setLatestEventInfo(getApplicationContext(), "MusicPlayer",
            text, pi);
    startForeground(NOTIFICATION_ID, mNotification);

}

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

0 голосов
/ 19 марта 2014

вы можете сделать это с BroadcastReceivers. в гугле вы найдете много как их использовать

...