Поэтому я не уверен, где и как реализовать этот метод, чтобы моя служба работала на переднем плане. В настоящее время я начинаю свою службу следующим образом в другом действии:
Intent i = new Intent(context, myService.class);
context.startService(i);
А затем в onCreate () myServices я пробую startForeground () ...?
Notification notification = new Notification();
startForeground(1, notification);
Так что да, я немного растерялся и не знаю, как это реализовать.
Ответы:
Я бы начал с полного заполнения
Notification
. Вот пример проекта, демонстрирующего использованиеstartForeground()
.источник
1337
?Из вашего основного действия запустите службу с помощью следующего кода:
Затем в вашем сервисе
onCreate()
вы создадите свое уведомление и установите его как передний план следующим образом:источник
Это мой код для установки службы на передний план:
Мне нужно создать уведомление с помощью PendingIntent, чтобы я мог начать свое основное действие из уведомления.
Чтобы удалить уведомление, просто вызовите stopForeground (true);
Он вызывается в onStartCommand (). Пожалуйста, обратитесь к моему коду по адресу: https://github.com/bearstand/greyparrot/blob/master/src/com/xiong/richard/greyparrot/Mp3Recorder.java
источник
Intent.FLAG_ACTIVITY_NEW_TASK
недействителен в контекстеPendingIntent
.Решение для Oreo 8.1
Я столкнулся с некоторыми проблемами, такими как RemoteServiceException, из-за недопустимого идентификатора канала в самых последних версиях Android. Вот как я это решил:
Деятельность :
BackgroundService:
ЭКВИВАЛЕНТ JAVA
источник
ContextCompat.startForegroundService(Context,Intent)
в своей деятельности то, что будет делать правильно. ( developer.android.com/reference/android/support/v4/content/… ).setCategory(NotificationCompat.CATEGORY_SERVICE)
вместо этого,Notification.CATEGORY_SERVICE
если ваш min API <21Build.VERSION_CODES.P
(уровень API 28) или более поздней версии должен запросить разрешениеManifest.permission.FOREGROUND_SERVICE
, чтобы использоватьstartForeground()
- см developer.android.com/reference/android/app/...В дополнение к ответу RAWA этот кусок кода:
Вы можете изменить на:
Если вы посмотрите внутрь этого метода, то увидите, что этот метод выполняет всю работу по проверке за вас.
источник
Если вы хотите сделать IntentService службой переднего плана
тогда вы должны переопределить
onHandleIntent()
этоКак сделать уведомление?
просто. Вот
getNotification()
методБолее глубокое понимание
Что происходит, когда сервис становится сервисом переднего плана
Что такое служба переднего плана?
Служба переднего плана,
гарантирует, что пользователь активно осведомлен о том, что что-то происходит в фоновом режиме, предоставляя уведомление.
(самое главное) не убивается системой, когда ей не хватает памяти
Пример использования службы переднего плана
Реализация функции загрузки песен в музыкальном приложении
источник
Добавьте данный код Сервисный класс для "OS> = Build.VERSION_CODES.O" в onCreate ()
Добавьте это разрешение в файл манифеста:
источник
Обработайте намерение по команде startCommand службы с помощью.
Этот вызов удалит службу из состояния переднего плана , позволяя убить ее, если потребуется больше памяти. Это не останавливает работу службы . Для этого вам нужно вызвать stopSelf () или связанные методы.
При передаче значения true или false указывается, хотите ли вы удалить уведомление или нет.
Обработайте свою задачу, когда функция destroy вызывается stopSelf () .
Создайте уведомление, чтобы служба продолжала работать на переднем плане.
Дайте кнопку остановки при уведомлении, чтобы остановить службу, когда это необходимо пользователю.
источник
Примечание. Если ваше приложение нацелено на уровень API 26 или выше, система накладывает ограничения на использование или создание фоновых служб, если само приложение не находится на переднем плане.
Если приложению необходимо создать службу переднего плана, оно должно вызвать
startForegroundService()
. Этот метод создает фоновую службу, но метод сигнализирует системе, что служба будет продвигать себя на передний план.После того, как служба была создана, служба должна вызвать ее
startForeground() method within five seconds.
источник
startForegroundService
методеВ моем случае все было совершенно иначе, поскольку у меня не было активности по запуску службы в Oreo.
Ниже приведены шаги, которые я использовал для решения этой проблемы службы переднего плана.
И после этого, чтобы запустить эту службу, я вызвал ниже cmd -
adb -s "+ serial_id +" оболочка am startforegroundservice -n com.test.socket.sample / .SocketService
Так что это помогает мне запускать сервис без активности на устройствах Oreo :)
источник
Решение @mikebertiean почти помогло, но у меня возникла проблема с дополнительным поворотом - я использую систему Gingerbread, и я не хотел добавлять дополнительный пакет только для запуска уведомления. Наконец я нашел: https://android.googlesource.com/platform/frameworks/support.git+/f9fd97499795cd47473f0344e00db9c9837eea36/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java
тогда я столкнулся с дополнительной проблемой - уведомление просто убивает мое приложение при запуске (как решить эту проблему: Android: как избежать этого, щелкнув по уведомлению, вызывающему onCreate () ), поэтому в целом мой код в службе выглядит так (C # / Xamarin):
источник