Service学习笔记03- 前台服务实战
Posted 双木青橙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Service学习笔记03- 前台服务实战相关的知识,希望对你有一定的参考价值。
0 系列汇总
- Service学习笔记01-启动方式与生命周期
- Service学习笔记02-实战 startService 与bindService
- Service学习笔记03- 前台服务实战
- Service学习笔记04- 其他服务实现方式与替代方式
1 前台服务
前台服务执行用户可以注意到的操作
前台服务显示状态栏通知,以便用户主动意识到您的应用正在前台执行任务并正在消耗系统资源,除非服务停止或者从前台删除,否则无法关闭通知
典型的使用前台服务的应用程序救命包括:
- 在前台服务中播放音乐的音乐播放器应用程序。通知可能会显示正在播放的当前歌曲。
- 在获得用户许可后,在前台服务中记录用户跑步的健身应用,该通知可能会显示用户在当前健身会话期间已经行进的距离。
1.1 请求前台服务权限
面向android 9 (API 28)或者更高版本并且使用前台服务的应用必须请求FOREGROUND_SERVICE权限,这是一个Normal权限,系统会主动授予。否则会抛出SecurityException
1.2 启动前台服务
Context context = getApplicationContext();
Intent intent = new Intent(...); // Build the intent for the service
context.startForegroundService(intent);
在服务内部,通常在onStartCommand
,你可以请求您的服务在前台运行。为此,请调用startForeground()
,该方法有两个参数:一个唯一标识状态栏中通知的正整数和Notification
对象本身
注意:
- 状态栏通知必须使用 PRIORITY_LOW 或更高的优先级。如果您的应用尝试使用优先级较低的通知,系统会在通知抽屉中添加一条消息,提醒用户该应用正在使用前台服务。
- 以Android 12 (API 31)或者更高版本的应用程序在后台运行时无法启动前台服务,除外数情况外,否则会抛出ForegroundServiceStartNotAllowedException 异常
例如:
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, notificationIntent,
PendingIntent.FLAG_IMMUTABLE);
Notification notification =
new Notification.Builder(this, CHANNEL_DEFAULT_IMPORTANCE)
.setContentTitle(getText(R.string.notification_title))
.setContentText(getText(R.string.notification_message))
.setSmallIcon(R.drawable.icon)
.setContentIntent(pendingIntent)
.setTicker(getText(R.string.ticker_text))
.build();
// Notification ID cannot be 0.
startForeground(ONGOING_NOTIFICATION_ID, notification);
1.3 从前台删除服务
要从前台删除服务,请调用stopForeground()
。此方法采用布尔值,指示是否也删除状态栏通知。请注意,该服务将继续运行。除非你调用stopService()
停止服务
如果您在服务在前台运行时停止它,它的前台通知也被删除。
案例
参考资料
以上是关于Service学习笔记03- 前台服务实战的主要内容,如果未能解决你的问题,请参考以下文章
Service学习笔记02-实战 startService 与bindService