Recently I implement the GCM on my app. I followed the tutorial code at this website
http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifi
The GCM
engine will try to deliver a message once it detects you've established a connection to them. I guess that when you kill your app, so is killed the open socket waiting to get messages and they won't try to deliver the message again.
When you open up the app again, all the pending messages are delivered as the GCM
engine will try to deliver all of them once it detects you've established a connection to them, that's why you get them all at the same time.