携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的18天,点击查看活动详情
前台服务
服务
- 它是一个应用程序组件,可以在后台执行长时间的任务,并且不提供特殊的用户界面。
- 除非另有说明,服务主要在主线程上运行。
- 前台
-服务+通知 - 背景
- BIND
- 您可以将组件绑定到服务以与服务交互,甚至执行进程间通信 (IPC)。
前台服务
- 不终止并继续运行的服务
- 用户可以感知。
- 即使内存不足,系统也不会强制终止服务。
- 通知必须一并提供。
- 将服务从服务内部提升到前台。
为什么要定义前台服务
因为没有 UI, 用户不知道 应用程序中运行的服务类型和正在使用的资源。这会影响安全性和性能。 这就是为什么此时需要前台服务。
如前所述,前台服务是一个用户可见的任务(它正在运行!不要忘记它!传播你的存在)。
如果是这样,您应该在状态栏中显示一个通知,其优先级应PRIORITY_LOW高于或等于通知。通知无法停止和删除服务,除非操作完成并且服务本身或由于各种因素而停止或从系统中删除。****
这将让用户知道某些操作正在后台执行,这些操作可能会消耗系统资源。
这就是为什么在前台服务方面,音频播放器应用程序就是一个简单的例子。
即使应用程序未上线,它也会在播放歌曲时显示通知,因此您可以与服务交互并显示当前播放的歌曲和相关信息。 在这种情况下,只有在服务终止时才会删除通知。
因此,您还可以显示操作,例如在显示订单跟踪的交付应用程序、滴滴等网约车应用程序(如果正在进行中)等的通知中显示乘车轨迹。
步骤
-
请求许可
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> -
onStartCommand()
- 返回值指定
-START_NOT_STICKY :如果被杀死则不会重新生成。
-START_STICKY :重新生成后调用 onStartCommand()。被杀死后的最后一个意图不再被调用。
-START_REDELIVER_INTENT:重新生成后调用 onStartCommand()。回忆在强制终止时传递的最后一个 Intent。
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
createNotificationChannel()
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("标题")
.setSmallIcon(R.drawable.icon)
.build()
startForeground(NOTIFICATION_ID, notification)
runbackground()
return START_STICKY
}
startForeground 和 stopForeground
Context.Compat.startForegroundService通过运行
stopServiceTerminate foreground service by启动前台服务
btn.setOnClickListener {
if(isChecked){
isChecked= false
val mapIntent = Intent(this, MapService::class.java)
stopService(mapIntent)
}
else{
isChecked = true
val mapIntent = Intent(this, MapService::class.java)
ContextCompat.startForegroundService(this, mapIntent)
}
}
notification
fun createNotificationChannel(){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
val serviceChannel = NotificationChannel(CHANNEL_ID, "MapService", NotificationManager.IMPORTANCE_LOW)
val manager = getSystemService(**NotificationManager**::class.java)
manager.createNotificationChannel(serviceChannel)
}
}
onStartCommand 部分
createNotificationChannel()
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("标题")
.setSmallIcon(R.drawable.icon)
.build()
5.onStartCommand里面写服务内容