1.服务是什么(Service)
Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。
2.前台服务(ForegroundService)是什么?
前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互,前台服务仍会继续运行。
应用场景
最常见的表现形式就是音乐播放服务,应用程序后台运行时,用户可以通过通知栏,知道当前播放内容,并进行暂停、继续、切歌等相关操作。
3.为什么用前台服务
后台运行的Service系统优先级相对较低,当系统内存不足时,在后台运行的Service就有可能被回收,为了保持后台服务的正常运行及相关操作,可以选择将需要保持运行的Service设置为前台服务,从而使APP长时间处于后台或者关闭(进程未被清理)时,服务能够保持工作。
4.前台服务使用
4.1定义前台服务
class ForegroundService : Service() {
companion object{
private const val TAG = "ForegroundService"
}
override fun onCreate() {
super.onCreate()
Log.d(TAG,"OnCreate")
}
override fun onBind(intent: Intent?): IBinder? {
Log.d(TAG,"onBind")
return null
}
override fun onUnbind(intent: Intent?): Boolean {
Log.d(TAG,"onUnbind")
return super.onUnbind(intent)
}
override fun onRebind(intent: Intent?) {
super.onRebind(intent)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d(TAG,"onStartCommand")
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy")
}
}
执行日志
2022-01-16 09:46:27.430 22461-22461/com.yifan.service D/ForegroundService: OnCreate
2022-01-16 09:46:27.430 22461-22461/com.yifan.service D/ForegroundService: onStartCommand
4.2在AndroidManifest.xml注册服务
<service android:name=".ForegroundService" />
需要在Android 9(API级别28)或者以上使用前台服务需要请求FOREGROUND_SERVICE权限,FOREGROUND_SERVICE这个安装权限,因此系统自动授权给请求的APP;
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<application ...>
...
<service android:name=".ForegroundService" />
</application>
</manifest>
注意:
需要在Android 9(API级别28)或者以上使用前台服务需要请求FOREGROUND_SERVICE权限,若没有请求FOREGROUND_SERVICE权限,系统会抛出SecurityException异常;
4.3创建服务通知内容,例如音乐播放,蓝牙设备正在连接等
companion object{
//通知ID
private const val NOTIFICATION_ID = 1111
//唯一的通知通道的ID
private const val notificationChannelId = "notification_channel_id_01"
}
/**
* 开启前台服务并发送