I have implemented GCM in my app and I am using GSMRegistrar as suggested here. No I am getting an error in logcat
7-02 23:35:15.830: E/ActivityThread(10442)
you have to destroy GCMRegistrar in your onDestroy method of activty class
unregisterReceiver(receiver);
GCMRegistrar.onDestroy(this);
You may use the application context, instead of the activity context. That way the backoff mechanism is not restricted by the activity life cycle.
It should be called inside onDestory() method of the activity that you started the GCM registration.
Keep in mind an activity may not be destroyed, even though another activity is launched on top of it. So your registration could still be retried in the background. If the registration activity is destroyed, then your GCMBroadcastReceiver class won't be there to handle the response anyway.
Update: After looking at the GCM library source code more carefully, here's what I've observed:
I think #3 is acceptable, as it's very rare that the GCM server will reject the registration with 'SERVICE_NOT_AVAILABLE' error. And as long as your user runs your app a few times, sooner or later their device will have successful registration.