Android - implementing startForeground for a service?

前端 未结 11 1278
不思量自难忘°
不思量自难忘° 2020-11-22 06:26

So I\'m not sure where/how to implement this method to make my service run in the foreground. Currently I start my service by the following in another activity:

<         


        
11条回答
  •  天涯浪人
    2020-11-22 07:13

    Handle intent on startCommand of service by using.

     stopForeground(true)
    

    This call will remove the service from foreground state, allowing it to be killed if more memory is needed. This does not stop the service from running. For that, you need to call stopSelf() or related methods.

    Passing value true or false indicated if you want to remove the notification or not.

    val ACTION_STOP_SERVICE = "stop_service"
    val NOTIFICATION_ID_SERVICE = 1
    ...  
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        super.onStartCommand(intent, flags, startId)
        if (ACTION_STOP_SERVICE == intent.action) {
            stopForeground(true)
            stopSelf()
        } else {
            //Start your task
    
            //Send forground notification that a service will run in background.
            sendServiceNotification(this)
        }
        return Service.START_NOT_STICKY
    }
    

    Handle your task when on destroy is called by stopSelf().

    override fun onDestroy() {
        super.onDestroy()
        //Stop whatever you started
    }
    

    Create a notification to keep the service running in foreground.

    //This is from Util class so as not to cloud your service
    fun sendServiceNotification(myService: Service) {
        val notificationTitle = "Service running"
        val notificationContent = " is using  "
        val actionButtonText = "Stop"
        //Check android version and create channel for Android O and above
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //You can do this on your own
            //createNotificationChannel(CHANNEL_ID_SERVICE)
        }
        //Build notification
        val notificationBuilder = NotificationCompat.Builder(applicationContext, CHANNEL_ID_SERVICE)
        notificationBuilder.setAutoCancel(true)
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.ic_location)
                .setContentTitle(notificationTitle)
                .setContentText(notificationContent)
                .setVibrate(null)
        //Add stop button on notification
        val pStopSelf = createStopButtonIntent(myService)
        notificationBuilder.addAction(R.drawable.ic_location, actionButtonText, pStopSelf)
        //Build notification
        val notificationManagerCompact = NotificationManagerCompat.from(applicationContext)
        notificationManagerCompact.notify(NOTIFICATION_ID_SERVICE, notificationBuilder.build())
        val notification = notificationBuilder.build()
        //Start notification in foreground to let user know which service is running.
        myService.startForeground(NOTIFICATION_ID_SERVICE, notification)
        //Send notification
        notificationManagerCompact.notify(NOTIFICATION_ID_SERVICE, notification)
    }
    

    Give a stop button on notification to stop the service when user needs.

    /**
     * Function to create stop button intent to stop the service.
     */
    private fun createStopButtonIntent(myService: Service): PendingIntent? {
        val stopSelf = Intent(applicationContext, MyService::class.java)
        stopSelf.action = ACTION_STOP_SERVICE
        return PendingIntent.getService(myService, 0,
                stopSelf, PendingIntent.FLAG_CANCEL_CURRENT)
    }
    

提交回复
热议问题