示例#1
0
        private void HandleRegistration(Context context, Intent intent)
        {
            var registrationId = intent.GetStringExtra(Constants.ExtraRegistrationId);
            var error          = intent.GetStringExtra(Constants.ExtraError);
            var unregistered   = intent.GetStringExtra(Constants.ExtraUnregistered);

            //Logger.Debug("handleRegistration: registrationId = " + registrationId + ", error = " + error + ", unregistered = " + unregistered);

            // registration succeeded
            if (registrationId != null)
            {
                GcmClient.ResetBackoff(context);
                GcmClient.SetRegistrationId(context, registrationId);
                OnRegistered(context, registrationId);
                return;
            }

            // unregistration succeeded
            if (unregistered != null)
            {
                // Remember we are unregistered
                GcmClient.ResetBackoff(context);
                var oldRegistrationId = GcmClient.ClearRegistrationId(context);
                OnUnRegistered(context, oldRegistrationId);
                return;
            }

            // last operation (registration or unregistration) returned an error;
            //Logger.Debug("Registration error: " + error);
            // Registration failed
            if (Constants.ErrorServiceNotAvailable.Equals(error))
            {
                var retry = OnRecoverableError(context, error);

                if (retry)
                {
                    var backoffTimeMs = GcmClient.GetBackoff(context);
                    var nextAttempt   = backoffTimeMs / 2 + sRandom.Next(backoffTimeMs);

                    //Logger.Debug("Scheduling registration retry, backoff = " + nextAttempt + " (" + backoffTimeMs + ")");

                    var retryIntent = new Intent(Constants.IntentFromGcmLibraryRetry);
                    retryIntent.PutExtra(ExtraToken, token);

                    var retryPendingIntent = PendingIntent.GetBroadcast(context, 0, retryIntent, PendingIntentFlags.OneShot);

                    var am = AlarmManager.FromContext(context);
                    am.Set(AlarmType.ElapsedRealtime, SystemClock.ElapsedRealtime() + nextAttempt, retryPendingIntent);

                    // Next retry should wait longer.
                    if (backoffTimeMs < MaxBackoffMs)
                    {
                        GcmClient.SetBackoff(context, backoffTimeMs * 2);
                    }
                }
            }
            else
            {
                // Unrecoverable error, notify app
                OnError(context, error);
            }
        }
        private void handleRegistration(Context context, Intent intent)
        {
            var registrationId = intent.GetStringExtra(Constants.EXTRA_REGISTRATION_ID);
            var error          = intent.GetStringExtra(Constants.EXTRA_ERROR);
            var unregistered   = intent.GetStringExtra(Constants.EXTRA_UNREGISTERED);

            Logger.Debug("handleRegistration: registrationId = " + registrationId + ", error = " + error + ", unregistered = " + unregistered);

            // registration succeeded
            if (registrationId != null)
            {
                GcmClient.ResetBackoff(context);
                GcmClient.SetRegistrationId(context, registrationId);
                OnRegistered(context, registrationId);
                return;
            }

            // unregistration succeeded
            if (unregistered != null)
            {
                // Remember we are unregistered
                GcmClient.ResetBackoff(context);
                var oldRegistrationId = GcmClient.ClearRegistrationId(context);
                OnUnRegistered(context, oldRegistrationId);
                return;
            }

            // last operation (registration or unregistration) returned an error;
            Logger.Debug("Registration error: " + error);
            // Registration failed
            if (Constants.ERROR_SERVICE_NOT_AVAILABLE.Equals(error))
            {
                var retry = OnRecoverableError(context, error);

                if (retry)
                {
                    int backoffTimeMs = GcmClient.GetBackoff(context);
                    int nextAttempt   = backoffTimeMs / 2 + sRandom.Next(backoffTimeMs);

                    Logger.Debug("Scheduling registration retry, backoff = " + nextAttempt + " (" + backoffTimeMs + ")");

                    var retryIntent = new Intent(Constants.INTENT_FROM_GCM_LIBRARY_RETRY);
                    retryIntent.PutExtra(EXTRA_TOKEN, TOKEN);

                    var retryPendingIntent = PendingIntent.GetBroadcast(context, 0, retryIntent, PendingIntentFlags.OneShot);

                    var am = AlarmManager.FromContext(context);
                    am.Set(AlarmType.ElapsedRealtime, SystemClock.ElapsedRealtime() + nextAttempt, retryPendingIntent);

                    // Next retry should wait longer.
                    if (backoffTimeMs < MAX_BACKOFF_MS)
                    {
                        GcmClient.SetBackoff(context, backoffTimeMs * 2);
                    }
                }
                else
                {
                    Logger.Debug("Not retrying failed operation");
                }
            }
            else
            {
                // Unrecoverable error, notify app
                OnError(context, error);
            }
        }