Aashutosh
Aashutosh

Reputation: 37

Supply pending intent to class from notification in Android

I am creating an notification by sending GCM message to my app using this code

private static void generateNotification(Context context, int type, String title, String message) {
    Intent notificationIntent;
    int icon = R.drawable.ic_launcher;
    java.util.Random v = new java.util.Random();
    int id = v.nextInt(1000);
    long when = System.currentTimeMillis();
    NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    NotificationCompat.Builder notification = new NotificationCompat.Builder(context);
    notificationIntent = new Intent(context, Home.class);
    notificationIntent.putExtra(CommonUtilities.TITLE_ALERT, title);
    notificationIntent.putExtra(CommonUtilities.EXTRA_MESSAGE, message);
    notificationIntent.putExtra(CommonUtilities.TYPE, type);
    notificationIntent.putExtra(CommonUtilities.ID, id);
    // set intent so it does not start a new activity
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent intent = PendingIntent.getActivity(context, type, notificationIntent, PendingIntent.FLAG_ONE_SHOT);
    Notification notification_view = notification.setContentTitle(title)
            .setContentText(message).setContentIntent(intent)
            .setSmallIcon(icon).setWhen(when)
            .setVibrate(new long[] { 1000 }).build();
    notification_view.flags |= Notification.FLAG_AUTO_CANCEL;

    // Play default notification sound
    notification_view.defaults |= Notification.DEFAULT_SOUND;

    // notification_view.sound = Uri.parse("android.resource://" +
    // context.getPackageName() + "your_sound_file_name.mp3");

    // Vibrate if vibrate is enabled
    notification_view.defaults |= Notification.DEFAULT_VIBRATE;
    manager.notify(id, notification_view);
}

and receiving this pending intent using receiver

private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(!intent.hasExtra(CommonUtilities.TYPE)){
            Log.v("msg", "intent vars not received");
            return;
        }
        int type = intent.getExtras().getInt(CommonUtilities.TYPE);
        String title = intent.getExtras().getString(CommonUtilities.TITLE_ALERT);
        String newMessage = intent.getExtras().getString(CommonUtilities.EXTRA_MESSAGE);
        String[] msgArr = newMessage.split(",");    
        Log.v("message", newMessage);
    }
};

But my activity is not performing the action and showing me log. I have registered my receiver with a custom intent using

registerReceiver(mHandleMessageReceiver, new IntentFilter(CommonUtilities.DISPLAY_ACTION));

How can I find the error?

Edit

If application receives a notification while it is on foreground then notifications are received well but if the activity is not running or it is finished and I invoke it on notification click nothing happened

Upvotes: 0

Views: 1142

Answers (2)

David Wasser
David Wasser

Reputation: 95578

You wrote:

If application receives a notification while it is on foreground then notifications are received well but if the activity is not running or it is finished and I invoke it on notification click nothing happened

If you register your receiver from your activity by calling:

registerReceiver(mHandleMessageReceiver, new IntentFilter(CommonUtilities.DISPLAY_ACTION));

then you have registered the receiver using the context of the activity. That means that when the activity is finished, the registered receiver will be removed and destroyed (to prevent memory leaks).

If you want your receiver to be run even if your app is not running, then you need to register the receiver in the manifest, by adding an appropriate intent filter to your <receiver> definition:

        <intent-filter>
            <!-- use the correct name string for CommonUtilities.DISPLAY_ACTION) -->
            <action android:name="blah.blah.blah.DISPLAY_ACTION"/>
        </intent-filter>

Upvotes: 1

the-ginger-geek
the-ginger-geek

Reputation: 7081

The code you have in generateNotification will only create a notification, not a broadcast.

Your Receiver won't ever receive anything because your'e never broadcasting. To utilize the receiver in the way you're using it you need to write code similar to this

public static final String DISPLAY_ACTION = "package.name.DISPLAY_MESSAGE";

public static final String EXTRA_MESSAGE = "message";

public static void displayMessage(Context context, String message) {
    Intent intent = new Intent(DISPLAY_ACTION);
    intent.putExtra(EXTRA_MESSAGE, message);
    context.sendBroadcast(intent);
}

EDIT

I would add this code above to your CommonUtilities class, you also need to add this line to your generateNotification method

CommonUtilities.displayMessage(context, message);//this will then send your broadcast to the receiver.

EDIT - Show notification message when app is opened

I'm using similar functionality in my app. I saved the notification in a database as unread when it has been received by GCM and then alerted the user, as soon as the app is opened i checked for unread notifications and if found invoked the displayMessage method to show the user the missed notifications. After that I delete the notification from the db.

Upvotes: 1

Related Questions