Search code examples
androidnotificationsgoogle-cloud-messagingandroid-notificationsandroid-notification-bar

Android Notification not shown


I wrote an IntentService for GCM Push Notifications. I receive the Messages but something's wrong with displaying my Notification to the user. Here's my Code:

import com.google.android.gms.gcm.GoogleCloudMessaging;
import android.app.IntentService;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.util.Log;

public class GcmIntentService extends IntentService {
    public static final int NOTIFICATION_ID = 1;


    public GcmIntentService() {
        super("GcmIntentService");
    }

    public static final String TAG = "GCM test";

    @Override
    protected void onHandleIntent(Intent intent) {
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
        String messageType = gcm.getMessageType(intent);
        if (!intent.getExtras().isEmpty()) {  // has effect of unparcelling Bundle
            if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
                sendNotification("Send error: " + intent.getExtras().toString());
            } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
                sendNotification("Deleted messages on server: " + intent.getExtras().toString());
                // If it's a regular GCM message, do some work.
            } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
                // Post notification of received message.
                sendNotification("message:\n" + intent.getStringExtra("message"));
                Log.i(TAG, "Received: " + intent.getExtras().toString());
            }
        }
        // Release the wake lock provided by the WakefulBroadcastReceiver.
        GcmBroadcastReceiver.completeWakefulIntent(intent);
    }

    private void sendNotification(String msg) {
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
                        .setSmallIcon(R.drawable.ic_notif)
                        .setContentTitle("My notification")
                        .setContentText(msg);
        Intent resultIntent = new Intent(this, PopupMessageActivity.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(PopupMessageActivity.class);
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(
                        0,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );
        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
    }
}

I don't see the mistake. I mean, I copied the code from the Androids developer guide.

The only thing that this code does, is that the small icon (in this case "ic_notif") is showing in the notification-bar of the phone. But there's no Text or Notification that pops up to the user.

I use android-studio. My debug device is an huawai u8666e with android 4.0.3 (API 15). At least i want this API level to be my minimum requirement for this app.


Solution

  • What you are seeing is normal designed Android behaviour for versions before Lollipop.

    The design logic is that this method creates a cleaner interface and will not interrupt the user's current actions by placing a popup in front of their face. (there is a lot of debate over which method is better - iOS popups vs Android notifications).

    Lollipop changes this slightly by creating a small popup at the top of the device window when a Notification is created.


    If you really want to force a popup dialog to be shown, you should be looking at designing a "full screen" Notification.

    See the Android Developer docs:

    Using this method, you can create a new Activity with any custom layout you want, and launch that instead of placing the Notification in the status bar.

    (full implementation of a full screen notification would be beyond the scope of this post)


    I would recommend against forcing full screen notifications except in rare cases, such as an Alarm Clock, or Phone Call app. I would, instead, recommend that you stick to the way Android was designed and work with the OS.