This isn't something than can be 'solved'. All the time, Google will make improvements to the OS (like JobScheduler in Lollipop) and devs will get better at managing their resources. Slowly we'll all get better battery performance.
I make PressureNet, which runs in the background on Android in 10-minute intervals to get GPS, barometer measurement, and network lock. Maintaining a good battery life isn't easy, but it is possible. https://play.google.com/store/apps/details?id=ca.cumulonimbu...
[1] http://support.apple.com/en-us/HT5873
[2] http://support.apple.com/library/content/dam/edam/applecare/...
It's not perfect, which is unfortunate and may be a blocker for other use cases. But for us it's a good balance of quality location and battery usage.
"I noticed your app made a separate request to the ad server every 30 seconds (between menus). So, I decided to batch up your requests and only send them every 10 minutes."
- The screen. Doesn't matter what the app is, if the screen is on the battery plummets
- Network hunting. If there's no WiFi, but the radio is on then it wastes loads of battery trying to find a network.