I wanted an old Android phone to show my homelab dashboard all day without me touching it. The kiosk apps I found kept the features I wanted behind a purchase, so I wrote my own: dKiosk, a Kotlin app built around Android's WebView. It shows one page full screen and won't follow links to other sites.
It also has to recover by itself. If a page fails to load, dKiosk shows why and keeps retrying, waiting longer each time, and it retries right away when the Wi-Fi comes back. WebView doesn't report a frozen page while nobody is touching the screen, so the app pings the page every 30 seconds and reloads it if there's no answer.
Most of the fixes before the 1.0 release were in that retry logic. WebView reports a load as finished even when it was dropped before the server answered. So when the app retried a server that accepted the connection and never replied, the dropped load counted as a finished page. That hid the error screen and cancelled the new attempt's timeout, so a hung server was only caught once, and after that nothing timed it out. Now a finish only counts if a page has started loading since the app's last attempt.
Another bug kept making the retries slower. Android reports the current network the moment an app asks to hear about network changes, so every time dKiosk came back to the front it looked like the Wi-Fi had come back. It retried right away and doubled its wait time each time. Now only a network that returns after being lost counts. To test cases like these I run a small local site with pages that break on purpose, like one that accepts the connection and never answers.
For the screen schedule, dKiosk covers the page with black and drops the brightness to zero. Turning the display itself off would need device admin rights and leave the phone locked. The page keeps running underneath, so it's current when the screen wakes. Home Assistant can switch the screen on and off over a small HTTP API. I wrote that server myself, because NanoHTTPD, the usual library for it, isn't maintained anymore and has open security issues.
dKiosk is free and MIT licensed, with signed APKs on the GitHub releases page. It runs on Android 8.0 or newer and doesn't need root.