例えばこんなコードがある場合

class MyService : Service() {
    private val broadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            when (intent?.action) {
                Intent.ACTION_SCREEN_OFF -> {
                    // suspend function内でRoomを使ってDBにアクセスしている
                    suspendFunction.execute()
                }
                Intent.ACTION_SCREEN_ON -> {
                    // suspend functionではないがRoomを使ってDBにアクセスしている
                    notSuspendFunctionButUseRoom.execute()
                }
            }
        }
    }
}

このようにしてブロードキャストレシーバー受信時にDBにアクセスする処理を書きます。Intent.ACTION_SCREEN_OFFの場合はsuspend functionで書かれているのでAndroidStudio上でエラーが表示され、コルーチンを使用してsuspend functionを呼び出す必要があります。

Intent.ACTION_SCREEN_ONの場合が少し厄介でsuspend functionで書かれてはいないがRoomを使ってDBにアクセスしている場合、このコードが実行されるとjava.lang.IllegalStateExceptionがスローされてクラッシュします。AndroidStudio上でエラー表示されないので、実行してテストすると実装が間違えている事に気付きます。そもそもですがRoomでDBにアクセスする場合はsuspend functionで書くようにしましょう。

修正例はこのようになります。

class MyService : Service() {
    private val broadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            when (intent?.action) {
                Intent.ACTION_SCREEN_OFF -> {
                    launch(start = CoroutineStart.LAZY) { withContext(Dispatchers.IO) {
                        suspendFunction.execute()
                    }.start()
                }
                Intent.ACTION_SCREEN_ON -> {
                    // notSuspendFunctionButUseRoom.execute()をsuspend functionにした上で
                    launch(start = CoroutineStart.LAZY) { withContext(Dispatchers.IO) {
                        suspendFunctionWithRoom.execute()
                    }.start()
                }
            }
        }
    }
}