Question

I was following the GCM Demo from android developers. Got the following situation. My OnHandleIntent inside GCMIntentService is not getting called. Can anybody help?

package com.xyz.ads;


import com.google.android.gms.gcm.GoogleCloudMessaging;

import android.app.IntentService;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class GcmIntentService extends IntentService {
    public GcmIntentService() {
        super("GcmIntentService");
        //super.onCreate();
        //super.onHandleIntent();
    }

    public void onCreate() {
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, startId, startId);
        Log.i("LocalService", "Received start id " + startId + ": " + intent);

        return START_STICKY;
    }
    public static final String TAG = "GCM Demo";

    @Override
    protected  void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
        // The getMessageType() intent parameter must be the intent you received
        // in your BroadcastReceiver.
        String messageType = gcm.getMessageType(intent);

        // Release the wake lock provided by the WakefulBroadcastReceiver.
        GcmBroadcastReceiver.completeWakefulIntent(intent);
    }
}

Here is my BroadCastReceiver

package com.xyz.ads;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;


public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // Explicitly specify that GcmIntentService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),GcmIntentService.class.getName());

        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

and my manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xyz.ads"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="19" />
    <!-- For Google Cloud Services -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!-- location -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <permission
        android:name="com.xyz.ads.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.xyz.ads.permission.C2D_MESSAGE" />
    <application
        android:name="ADS"
        android:allowBackup="true"
        android:debuggable="true"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/Theme.AppCompat"
        >
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity
            android:name=".ui.DummyActivity"
            android:label="@string/title_activity_dummy" >
        </activity>


        <!-- For Google Cloud Services -->
        <receiver
            android:name=".GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.xyz.ads" />
            </intent-filter>
        </receiver>

        <service
            android:name="GcmIntentService"
            android:enabled="true" >
        </service>

    </application>

</manifest>

onReceive inside receiver is getting called and constructor of intent service..

Was it helpful?

Solution

I would say that you lack a dot in the name of the class.

<service
    android:name=".GcmIntentService"
    android:enabled="true" >
</service>

The dot stands for the package name of your app.
Let's say your package name is com.example.app. Then writing .GcmIntentService has the same effect as writing com.example.app.GcmIntentService.

OTHER TIPS

try this

<receiver
            android:name="com.xyz.ads.GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>

                <!-- Receives the actual messages. -->
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />

                <category android:name="com.xyz.ads" />
            </intent-filter>
        </receiver>

 <service
            android:name="com.xyz.ads.GcmIntentService"
            android:enabled="true" >
        </service>

I had the same problem but it wasn't the code (everithing was like yours, like the doc says: http://developer.android.com/google/gcm/client.html), it was the Eclipse project.

Check this if it could help you:

Do a refactor and move the service from one package to another. Check if the androidManifest.xml doesn't change the package automatically. If not then you have the same problem than me.

I solved it by removing the ServiceIntent class and creating a new one (with the same content). It appears that my service was disconnected or something like this, and for the time I realized that I had got crazy by comparing the code.

With the new one, if you check again you will see the package changing in the androidmanifest.xml and your service called by the GcmBroadcastReceiver!! :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top