If you're wanting to ensure the time is accurate, you should get the time from the internet or from the GPS on the device.
If the user closes the app, there is nothing left to run a timer with. Even services are paired with a process and will get cleaned up if not being used.
You can detect time changes when your app is running, but your app won't know what happened while it wasn't running.
Here's a strategy that may work. It does involve using the internet, but it limits the usage to times when the user should likely have a connection. This avoids the player not being able to play when there's no connection.
- When the game is installed, connect to the internet and get the time you want to use, along with the device time.
- Every time a building is built, record a timestamp to the file system. (If a connection is available, get the time from the internet to verify).
- When/if the player submits their score the leaderboard, connect to the internet again and get the time you want to use. Ensure that all the buildings were built between the current time and the last valid time you have recorded. If it's impossible for the player to have built that many buildings in that time frame, invalidate the score.
It doesn't detect every case, but it should help a little.