For Android version 4 (API 14 and up), it might be possible to use:
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
However, on the emulator, it doesn't block the home button, so it's kinda useless.
I still don't know if it works fine on real devices.
Maybe it's possible to use the following workaround:
Set the app as the default home screen app.
If the home button was pressed while the application was active, capture it and do nothing.
If the home button was pressed while the application was on the background (or closed), open the previously selected default home app.
Alternatively, I could ask the user to set the default home launcher app as mine for each time it is started, and reset it again (either to the previous one, or total reset) after it is closed.
Is it possible? If so, how?
Since Android 5.0 (Lollipop) (version 5.0 which is API 21), there is a way of screen-pinning, and this can be turned on by the user or the app (link here):
There are two ways to activate screen pinning:
Manually: Users can enable screen pinning in Settings > Security >
Screen Pinning, and select the tasks they want to pin by touching the
green pin icon in the recents screen. Programmatically: To activate
screen pinning programmatically, call startLockTask() from your app.
If the requesting app is not a device owner, the user is prompted for
confirmation. A device owner app can call the setLockTaskPackages()
method to enable apps to be pinnable without the user confirmation
step.
What does it do? Read further and see:
When task locking is active, the following behavior happens:
The status bar is blank, and user notifications and status information
are hidden. The Home and Recent Apps buttons are hidden. Other apps
cannot launch new activities. The current app can start new
activities, as long as doing so does not create new tasks. When screen
pinning is invoked by a device owner, the user remains locked to your
app until the app calls stopLockTask(). If screen pinning is activity
by another app that is not a device owner or by the user directly, the
user can exit by holding both the Back and Recent buttons.
Not only that, but according to this post, you can also toggle this without user-confirmation, and exiting this special state would be under your app's logic.
It seems like the perfect thing for toddler safe app.