Search code examples
androidandroid-intentpush-notificationgoogle-cloud-messagingandroid-broadcastreceiver

Android CGM start Activity after receiving Push Notification


After a Push Notification is received, I want to open an Àctivity when the Notification is pressed.

Here are my Services:

public class GCMIntentService extends GcmListenerService {
@Override
public void onMessageReceived(String from, Bundle data) {
    String title = data.getString("title");
    String message = data.getString("message");

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(message)
            .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
            .setTicker(message)
            .setAutoCancel(true);

    mBuilder.setDefaults(Notification.DEFAULT_LIGHTS);
    mBuilder.setDefaults(Notification.DEFAULT_SOUND);
    mBuilder.setDefaults(Notification.DEFAULT_VIBRATE);


    Intent myIntent = new Intent(this, MyActivity.class);
    PendingIntent intent2 = PendingIntent.getBroadcast(this, 1, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(intent2);

    notificationManager.notify(1, mBuilder.build());
}



public class GCMIDListenerService extends InstanceIDListenerService {
@Override
public void onTokenRefresh() {
    InstanceID instanceID = InstanceID.getInstance(this);
    String token;
    try {
        token = instanceID.getToken(Resources.getSystem().getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
    } catch (IOException e) {
        e.printStackTrace();
    }
    //TODO:send token to the server
  }
}

I just did everything following the Google documentation. I implemented that feature for another project sometime ago but it was a bit different, I used my own 'BroadcastReceiver' instead of the 'com.google.android.gms.gcm.GcmReceiver' provides by Google.

Here is my Manifest:

<application>

...

 <!-- GCM Push Notifications Config -->
    <receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="gcm" />
        </intent-filter>
    </receiver>
    <service
        android:name=".push.GCMIntentService"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>
    <service
        android:name=".push.GCMIDListenerService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.gms.iid.InstanceID" />
        </intent-filter>
    </service>


</application>

Any ideas? Am I missing something?

Here some documentation I have follow:

Google official documentation

CGM tutorial By Dustin Rothwell

And of course I have researched a lot here at stackoverflow.

Thanks!


Solution

  • You have done one minor mistake. You are writing this code for opening activity.

    PendingIntent intent2 = PendingIntent.getBroadcast(this, 1, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(intent2);
    

    As you want to open activity you need to create pending intent using getActivity method instead of getBroadcast method.

    Hope this will help.