Presentations From a Service

For a while now, I have been saying that the only way to use the Presentation class to display stuff on a TV/monitor/projector is through an Activity, because Presentation inherits from Dialog. That is true.

Sometimes, I would say that the only way to display stuff on a TV/monitor/projector is through an Activity. That, as it turns out, is not true.

One Stack Overflow answer led to my own Stack Overflow question on the subject, and with the help of those SO contributors I eventually figured out how to drive an external display without an Activity.

I wrapped that pattern up into a PresentationService that I have added to my CWAC-Presentation library. PresentationService clones some of the logic from Presentation and Dialog, enough to allow you to define a View that will be shown on a Window connected to the Display object representing the external display.

The biggest limitation is that we have to use a TYPE_SYSTEM_ALERT Window, which in turn requires the SYSTEM_ALERT_WINDOW permission. This is a permission that I really try to avoid, both as a developer and as a user. Ostensibly, it is there because otherwise a Service could draw over the main display without the user being aware of it. Perhaps in the future, a Service rendering to an external display might be able to avoid this permission or switch to some alternate, less-scary permission.

I hope to cover the implementation of PresentationService in the next update to my book. If you simply want to use it, the project README contains basic instructions for using it, and there is a dedicated sample project showing how to use it.

Learn second-generation Android app development — with Kotlin and the Android Jetpack — through CommonsWare’s Android app development training!