- Полный список
- IntentService
- Foreground
- Автозагрузка
- Android-реализация startForeground для сервиса?
- 9 ответов:
- решение для Oreo 8.1
- если вы хотите сделать IntentService службой переднего плана
- как сделать уведомление ?
- Более Глубокое Понимание
- что происходит, когда служба становится основной услуги
- Что такое служба переднего плана ?
- вариант использования службы переднего плана
- Android Foreground Service Example
- 1. Android Foreground Service Example.
- 2. Example Source Code.
- 2.1 Android Foreground Service Class.
- 2.2 Main Activity.
- 2.3 Layout XML File.
- 2.4 Android Manifest Xml File.
- 2.5 Assign FOREGROUND_SERVICE Permission.
Полный список
— изучаем IntentService
— включаем режим Foreground для сервиса
— помещаем сервис в автозагрузку
Строили мы, строили, и, наконец, построили. Урок номер 100, с чем всех нас и поздравляю )
В этом уроке рассмотрим еще несколько полезных вещей про сервисы. Выносить каждую из них в отдельный урок я не стал, вполне можно в одном все рассмотреть. Проекты здесь тоже создавать не будем, чтобы урок не получился слишком громоздким. Я просто приведу некоторые куски кода и скрины для наглядности своих рассуждений. А если у вас будет желание, вы по этим наработкам сами можете создать проекты-примеры.
IntentService
Это подкласс обычного Service. Он используется, если вам в сервисе надо выполнять какие-то тяжелые задачи, и вы не хотите сами возиться с асинхронностью. Принцип работы этого вида сервиса прост. Он создает новый поток для своей работы. Затем берет все Intent пришедшие ему в onStartCommand и отправляет их на обработку в этот поток. Как именно обрабатываются Intent – зависит от нас, т.к. мы сами кодим это в методе onHandleIntent.
Т.е. приложение сыпет в сервис вызовами startService, в которых передает Intent-ы. IntentService принимает эти вызовы в onStartCommand, берет Intent-ы и отправляет их в очередь на обработку. И далее они поочередно обрабатываются в отдельном потоке методом onHandleIntent. Когда последний Intent из очереди обработан, сервис сам завершает свою работу.
В приложении делаем три вызова:
Где time – это время паузы, которую будем делать в сервисе, а label – просто метка, чтобы отличать вызовы.
Здесь необходим конструктор, в котором вызываем конструктор супер-класса и указываем какое-нить имя. Оно будет использовано для наименования потока.
В методе onHandleIntent кодим обработку Intent-ов. Достаем из них time и label, запускаем паузу на time секунд и выводим в лог label в начале и в конце.
В итоге, при запуске в логах видим:
11:07:37.880: D/myLogs(4137): onCreate
11:07:37.880: D/myLogs(4137): onHandleIntent start Call 1
11:07:40.880: D/myLogs(4137): onHandleIntent end Call 1
11:07:40.880: D/myLogs(4137): onHandleIntent start Call 2
11:07:41.880: D/myLogs(4137): onHandleIntent end Call 2
11:07:41.880: D/myLogs(4137): onHandleIntent start Call 3
11:07:45.890: D/myLogs(4137): onHandleIntent end Call 3
11:07:45.890: D/myLogs(4137): onDestroy
Сервис создался, вызовы выполнились по очереди и сервис завершил работу. От нас понадобилось только накодить обработку.
Foreground
Вы можете сказать системе, что ваш сервис очень важен для пользователя и его нельзя грохать при нехватке памяти. Это актуально, например, для музыкального плеера. В статус-бар при этом будет помещено уведомление.
На вход он принимает те же параметры, что и NotificationManager.notify – ID и Notification.
Т.е. вы создаете уведомление, назначаете ему ID и передаете это в startForeground. Сервис переходит в режим IDDQD :), а в статус-баре появилось уведомление.
Оно появилось в разделе для постоянных уведомлений (Ongoing).
Метод stopForeground (boolean removeNotification) — возвращает сервису способность быть убитым системой в случае острой нехватки памяти. А на вход он принимает boolean-значение – удалять уведомление из статус-бара или нет.
Уведомление также пропадет, когда сервис будет остановлен.
Эти методы работают, начиная с Android 2.0. Пример реализации для более ранних версий есть в хелпе.
Напомню, что уведомления мы научились создавать на прошлом уроке.
Автозагрузка
Сервисы для получения погоды или почты имеет смысл помещать в автозагрузку. Для этого нам надо создать BroadcastReceiver, настроить его IntentFilter на Action = android.intent.action.BOOT_COMPLETED, и добавить права android.permission.RECEIVE_BOOT_COMPLETED. Этот BroadcastReceiver будет вызван системой при старте системы и в нем мы кодим запуск сервиса.
Допустим, есть проект с сервисом MyService.
Создаем в проекте класс MyBroadReceiv
В манифесте добавляем его как Receiver и настраиваем фильтр
Добавляем права на получение сообщения о загрузке
Инсталлим проект на AVD. Закрываем AVD. Запускаем через меню в Eclipse: Window > AVD Manager. Находим там наш эмулятор и запускаем вручную.
Когда он запустился, смотрим логи
onReceive android.intent.action.BOOT_COMPLETED
MyService onCreate
MyService onStartCommand
Сработал BroadcastReceiver и запустил сервис.
Если после запуска AVD логи не отображаются, то откройте DDMS и во вкладке Devices явно выберите ваш AVD.
P.S. Я уже писал об этом, но напишу еще раз. Последующие уроки будут выходить по более свободному графику. Следите за обновлениями.
На следующем уроке:
— создаем свой ContentProvider
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Android-реализация startForeground для сервиса?
поэтому я не уверен, где/как реализовать этот метод, чтобы мой сервис работал на переднем плане. В настоящее время я начинаю свою службу следующим образом в другом действии:
а затем в myServices’ onCreate () я пытаюсь startForeground ().
Так что да я немного потерял и не уверен, как это реализовать.
9 ответов:
Я бы начал с полного заполнения Notification . вот пример проекта демонстрация использования startForeground() .
из вашего основного вида деятельности, запустите службу со следующим кодом:
тогда к вашим услугам для onCreate() вы бы построить свое уведомление и установить его в качестве переднего плана, как так:
Это мой код для установки службы на передний план:
Мне нужно построить уведомление с помощью PendingIntent, чтобы я мог начать свою основную деятельность с уведомления.
чтобы удалить уведомление, просто вызовите stopForeground (true);
решение для Oreo 8.1
я столкнулся с некоторыми проблемами, такими как RemoteServiceException из-за неверного идентификатора канала с самыми последними версиями Android. Вот как я решил это:
активность:
BackgroundService:
ЭКВИВАЛЕНТ JAVA
если вы хотите сделать IntentService службой переднего плана
затем вы должны переопределить onHandleIntent() такой
как сделать уведомление ?
простой. Вот это getNotification() метод
Более Глубокое Понимание
что происходит, когда служба становится основной услуги
Что такое служба переднего плана ?
служба переднего плана,
гарантирует, что пользователь активно осознает, что что-то происходит в фоновом режиме путем предоставления уведомления.
(самое главное) не убивается системой, когда у нее заканчивается память
вариант использования службы переднего плана
кроме Раве ответьте, это мир кода:
Вы можете изменить на:
Если вы посмотрите внутри этого метода, то вы можете увидеть, что этот метод делает все проверки работы для вас.
в моем случае это было совершенно другое, так как у меня не было активности для запуска службы в Oreo.
Ниже приведены шаги, которые я использовал для решения этой проблемы-
и после этого для запуска этой службы я запустил ниже cmd —
adb-s «+ serial_id + » shell am startforegroundservice-N com.тест.разъем.образец./SocketService
Так что это помогает мне начать обслуживание без активности на устройствах Oreo:)
обрабатывать намерение на startCommand сервиса с помощью.
этот вызов удалить службу из состояния переднего плана, что позволяет его убить, если требуется больше памяти. это не останавливает службу запуск. Для этого вам нужно позвонить stopSelf() или связанные методы.
передает значение правда или ложные указывается, если вы хотите удалить уведомление или не.
обрабатывать вашу задачу, когда на уничтожить называется stopSelf().
создайте уведомление, чтобы служба работала на переднем плане.
дайте кнопку остановки на уведомление, чтобы остановить службу, когда пользователь нуждается.
666666666666666666666666666666666666666666666666666666666666666666666
333333333333333333333333333333333333333333333333333333333333333333333
000000000000000000000000000000000000000000000000000000000000000000000
Источник
Android Foreground Service Example
Android foreground service is an android service object. It always runs in the foreground, this can avoid service objects being recycled by the android system when android os does not have enough resources. Android foreground service can interact with users through notification. It is usually used in a music player, file downloader, etc which user has few interactions with the player service but the service should not be stopped and recycled.
1. Android Foreground Service Example.
- There are 2 buttons in the Android app. When you click the START FOREGROUND SERVICE button, it will create and start a foreground service.
- The foreground service will show a head-up notification which will pop up at the screen top with max priority. The notification is also a text-style notification.
- There are two buttons in the notification, clicking each button will display a toast message at the screen bottom. When you click the STOP FOREGROUND SERVICE button, it will stop the service and remove the notification.
2. Example Source Code.
- The below source files are the example project files.
- There are two java files in this example MyForeGroundService.java & CreateForegroundServiceActivity.java.
- MyForeGroundService.java: This is the android foreground service class. It overrides the android.app.Service.onStartCommand(Intent intent, int flags, int startId) method. This method will be invoked when the activity invokes the startService(intent) method.
- In the onStartCommand method, it will check which button has been pressed by the intent.getAction() method returned value, and then invokes a related method such as startForegroundService().
- In the startForegroundService() method, to make the service object run in the foreground, it will create a Notification object, and then call the startForeground() method to make the service object run as foreground service.
- In the stopForegroundService() method, it will stop the MyForeGroundService service object from the foreground service by invoking the stopForeground(true) method, this will also remove the notification object. Then it will call the stopSelf() method to stop the service object.
- CreateForegroundServiceActivity.java: This is the activity class java file. It will be created when the android app starts. It will listen to the two buttons on-click event, and when one button is clicked, it will start the MyForeGroundService object by creating an Intent object, setting the intent object action, and then calling the startService(intent) method to start the service object. Then the MyForeGroundService object will be created, and its onStartCommand method will be invoked.
2.1 Android Foreground Service Class.
- MyForeGroundService.java
2.2 Main Activity.
- CreateForegroundServiceActivity.java
2.3 Layout XML File.
- activity_create_foreground_service.xml
2.4 Android Manifest Xml File.
- AndroidManifest.xml
2.5 Assign FOREGROUND_SERVICE Permission.
- If your android app os version is higher than or equal to level 26, you need to assign FOREGROUND_SERVICE permission in your android app to avoid crashes.
- To implement this, you should add the below XML snippet in the AndroidManifest.xml file.
Reference
This site uses Akismet to reduce spam. Learn how your comment data is processed.
This gives error for Android O & above versions.
I am facing error as : Developer warning for package “com.xxx.xxx”. Failed to post notification on channel “null”.
Android O Need Notification Channel like that
private fun startForegroundService() <
Log.d(TAG_FOREGROUND_SERVICE, “Start foreground service.”)
// Create notification default intent.
val intent = Intent()
val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
val channelId = “NOTIFICATION_CHANNEL_NAME”
// Create notification builder.
val builder = NotificationCompat.Builder(this,channelId)
// Make notification show big text.
val bigTextStyle = NotificationCompat.BigTextStyle()
bigTextStyle.setBigContentTitle(“Music player implemented by foreground service.”)
bigTextStyle.bigText(“Android foreground service is a android service which can run in foreground always, it can be controlled by user via notification.”)
// Set big text style.
builder.setStyle(bigTextStyle)
builder.setWhen(System.currentTimeMillis())
builder.setSmallIcon(R.mipmap.ic_launcher)
val largeIconBitmap = BitmapFactory.decodeResource(resources, R.drawable.abc_ic_ab_back_material)
builder.setLargeIcon(largeIconBitmap)
// Make the notification max priority.
builder.priority = Notification.PRIORITY_MAX
// Make head-up notification.
builder.setFullScreenIntent(pendingIntent, true)
// Add Play button intent in notification.
val playIntent = Intent(this, MyForeGroundService::class.java)
playIntent.action = ACTION_PLAY
val pendingPlayIntent = PendingIntent.getService(this, 0, playIntent, 0)
val playAction = NotificationCompat.Action(android.R.drawable.ic_media_play, “Play”, pendingPlayIntent)
builder.addAction(playAction)
// Add Pause button intent in notification.
val pauseIntent = Intent(this, MyForeGroundService::class.java)
pauseIntent.action = ACTION_PAUSE
val pendingPrevIntent = PendingIntent.getService(this, 0, pauseIntent, 0)
val prevAction = NotificationCompat.Action(android.R.drawable.ic_media_pause, “Pause”, pendingPrevIntent)
builder.addAction(prevAction)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) <
val channel = NotificationChannel(
channelId, “NOTIFICATION_CHANNEL_NAME”,
NotificationManager.IMPORTANCE_HIGH
).apply <
enableLights(true)
lightColor = Color.DKGRAY
setShowBadge(true)
enableVibration(true)
vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400)
>
notificationManager.createNotificationChannel(channel)
>
// Build the notification.
val notification = builder.build()
// Start foreground service.
startForeground(1, notification)
>
Источник