Every GCM message has expired date, the message might have expired, or the device is not connected, and messages are not real time.
GCM uses broadcast receiver to deliver messages in following steps:
1. onClick() calls gcm.send()
2. onReceive() method in broadcast receiver triggered
3. the method handles GCM messages
A WakefulBroadcastReceiver is a special type of broadcast receiver that takes care of creating and managing a partial wake lock for your app. It passes off the work of processing the GCM message to a Service (typically an IntentService), while ensuring that the device does not go back to sleep in the transition. If you don't hold a wake lock while transitioning the work to a service, you are effectively allowing the device to go back to sleep before the work completes. The net result is that the app might not finish processing the GCM message until some arbitrary point in the future, which is not what you want.
However, using WakefulBroadcastReceiver is not a requirement. If your app does not require a service, you can use a regular BroadcastReceiver.
According to the GCM documentation, after registering, the app calls storeRegistrationId() to store the registration ID in shared preferences for future use. This is just one way of persisting a regID. So the registration_id is good for data persistence.