为了活动小家电-前台服务

133 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的18天,点击查看活动详情

前台服务

服务

  • 它是一个应用程序组件,可以在后台执行长时间的任务,并且不提供特殊的用户界面。
  • 除非另有说明,服务主要在主线程上运行。
  1. 前台
    -服务+通知
  2. 背景
  3. BIND
    • 您可以将组件绑定到服务以与服务交互,甚至执行进程间通信 (IPC)。

前台服务

  • 不终止并继续运行的服务
  • 用户可以感知。
  • 即使内存不足,系统也不会强制终止服务。
  • 通知必须一并提供。
  • 将服务从服务内部提升到前台。

为什么要定义前台服务

因为没有 UI, 用户不知道 应用程序中运行的服务类型和正在使用的资源。这会影响安全性和性能。 这就是为什么此时需要前台服务。

如前所述,前台服务是一个用户可见的任务它正在运行!不要忘记它!传播你的存在)。 如果是这样,您应该在状态栏中显示一个通知,其优先级应PRIORITY_LOW高于或等于通知。通知无法停止和删除服务,除非操作完成并且服务本身或由于各种因素而停止或从系统中删除。****

这将让用户知道某些操作正在后台执行,这些操作可能会消耗系统资源。

这就是为什么在前台服务方面,音频播放器应用程序就是一个简单的例子。

即使应用程序未上线,它也会在播放歌曲时显示通知,因此您可以与服务交互并显示当前播放的歌曲和相关信息。 在这种情况下,只有在服务终止时才会删除通知。

因此,您还可以显示操作,例如在显示订单跟踪的交付应用程序、滴滴等网约车应用程序(如果正在进行中)等的通知中显示乘车轨迹。

步骤

  1. 请求许可
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

  2. 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
    }
  1. 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)
            }
        }
  1. 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里面写服务内容