SlavisDEV
SlavisDEV

Reputation: 35

Android: Service doesn't work after screen is off

I am trying to create service which will be fetch data from server (periodicaly) and send notification to user. I achieved almost my goal, but service stops work when screen is off. When I turn on my phone I get plenty of notifications from previous time.

Service code:

class MyService: Service() {

    override fun onCreate() {
        super.onCreate()

        val handler = Handler()
        val runnable = object: Runnable {
            override fun run() {
                getDataFromServer()
                handler.postDelayed(this, 1800000)
            }
        }
        handler.post(runnable)
    }

    private fun getDataFromServer() {
        // fetch data

        displayNotification(description)
    }

    private fun displayNotification(description: String) {
        val intent = Intent(this, MainActivity::class.java)

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        val notificationId = (0..300).random()

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val adminChannelName = "Messages channel"
            val adminChannelDescription = "Notification about new data"

            NotificationChannel(ADMIN_CHANNEL_ID, adminChannelName, NotificationManager.IMPORTANCE_HIGH).apply {
                description = adminChannelDescription
                enableLights(true)
                lightColor = Color.RED
                enableVibration(true)
                notificationManager.createNotificationChannel(this)
            }
        }

        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        val pendingIntent = PendingIntent.getActivity(
            this, 0, intent, PendingIntent.FLAG_ONE_SHOT
        )

        val notificationSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
        val notificationBuilder = NotificationCompat.Builder(this, ADMIN_CHANNEL_ID)
            .setSmallIcon(R.drawable.icon_small)
            .setContentTitle(getText(R.string.notification_new_data_title))
            .setContentText(getString(R.string.notification_new_data_text, description))
            .setAutoCancel(true)
            .setSound(notificationSoundUri)
            .setContentIntent(pendingIntent)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            notificationBuilder.color = ContextCompat.getColor(context, R.color.icon_background)
        }
        notificationManager.notify(notificationId, notificationBuilder.build())
    }

    override fun onBind(intent: Intent): IBinder ? {
        return null
    }
}

Thank you for your help!

Upvotes: 0

Views: 411

Answers (1)

Bruno Martins
Bruno Martins

Reputation: 1436

Try to start you service using the startForegroundService instead of startService, whether you need a background service, you can convert you Service to JobIntentService: https://developer.android.com/reference/androidx/core/app/JobIntentService

Upvotes: 1

Related Questions