Java – GCM onHandleIntent(Intent intent) is not called

GCM onHandleIntent(Intent intent) is not called… here is a solution to the problem.

GCM onHandleIntent(Intent intent) is not called

My onHandleIntent(Intent intent) function in gcmIntentService has a registration for GCM and a call to another function that sends the gcm token to the backend variable Db. When I run MainActivity, the constructor of GcmintentService is called, while onHandleIntent does not. This is my GcmIntentService.

public class GcmIntentService extends IntentService {

private static final String TAG = "RegIntentService";
    private static final String[] TOPICS = {"global"};
    String senderId = "1048700326431";

AsyncHttpClient client = new AsyncHttpClient();

public GcmIntentService() {

super(TAG);
        Log.i(TAG, "ALWAYS IN HERE");
    }

@Override
    public void onHandleIntent(Intent intent) {

Log.i(TAG, " NOW I NEED IT IN HERE");

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

try {
             [START register_for_gcm]
             Initially this call goes out to the network to retrieve the token, subsequent calls
             are local.
             [START get_token]
            InstanceID instanceID = InstanceID.getInstance(this);
            String token = instanceID.getToken(senderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

 [END get_token]
            Log.i(TAG, "GCM Registration Token: " + token);

 TODO: Implement this method to send any registration to your app's servers.
            sendRegistrationToServer(token);

 Subscribe to topic channels
            subscribeTopics(token);

 You should store a boolean that indicates whether the generated token has been
             sent to your server. If the boolean is false, send the token to your server,
             otherwise your server should have already received the token.
            sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, true).apply();
             [END register_for_gcm]
        } catch (Exception e) {
            Log.d(TAG, "Failed to complete token refresh", e);
             If an exception happens while fetching the new token or updating our registration data
             on a third-party server, this ensures that we'll attempt the update at a later time.
            sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false).apply();
        }
         Notify UI that registration has completed, so the progress indicator can be hidden.
        Intent registrationComplete = new Intent(QuickstartPreferences.REGISTRATION_COMPLETE);
        LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete);
        }

/**
     * Persist registration to third-party servers.
     *
     * Modify this method to associate the user's GCM registration token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private void sendRegistrationToServer(String token) {
            final RequestParams params = new RequestParams();
            params.put("id", token);

client.post("", params, new JsonHttpResponseHandler() {

@Override
                public void onStart() {
                     called before request is started
                }

public void onSuccess(int statusCode, PreferenceActivity.Header[] headers, JSONObject response) {

}

public void onFailure(int statusCode, PreferenceActivity.Header[] headers, JSONObject errorResponse, Throwable e) {
                     called when response HTTP status is "4XX" (eg. 401, 403, 404)
                }

@Override
                public void onRetry(int retryNo) {
                     called when request is retried
                }
            });
    }

/**
     * Subscribe to any GCM topics of interest, as defined by the TOPICS constant.
     *
     * @param token GCM token
     * @throws IOException if unable to reach the GCM PubSub service
     */
     [START subscribe_topics]
    private void subscribeTopics(String token) throws IOException {
        for (String topic : TOPICS) {
            GcmPubSub pubSub = GcmPubSub.getInstance(this);
            pubSub.subscribe(token, "/topics/" + topic, null);
        }
    }

}

Solution

I had the same issue but solved it by adding it to the list :

<service
            android:name="com.futec.h2o.RegistrationIntentService"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            </intent-filter>
        </service>

Related Problems and Solutions