Instead of using normal sleep APIs or loops, make timer classes based on the Android alarm API, so the device can sleep.
For each timer usage in the stack, consider whether it is something that should really wake the device or not.
Look at strategies to merge adjacent timeouts to minimize the number of wakeups.
The existing implementation is using select() to wait until the timeout of next timer that is linked with given thread. This results in the thread and possibly the process also sleeping(going to sleep) until the timer fires or an event is triggered on one of the FDs linked to the given thread.
As a consequence, there may not be a need for integrating or using Android sleep or timer primitives.