9

I have an application which is basically a webview and GCM notifications. I want to achieve the following thing: If the user is in the app and receives a notification, when he clicks the notification I want the webview to load the url provided in the notification.

I'm trying to accomplish this by using broadcast receiver but it doesn't work.

I dynamically register the receiver in the MainActivity:

private void registerNotificationReceiver() {
        final IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_LOAD_URL_FROM_NOTIFICATION);
        Log.i(TAG, "registerNotificationReceiver()");
        this.receiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d(TAG, "notification received");

            }
        };

        super.registerReceiver(this.receiver, filter);
    }

And in the GCM Listener I'm using PendingIntent.getBroadast():

final Intent broadcastIntent = new Intent(MainActivity.ACTION_LOAD_URL_FROM_NOTIFICATION);
        PendingIntent intent = PendingIntent.getBroadcast(getApplicationContext(), 0, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        notificationBuilder.setContentIntent(intent);

        notification = notificationBuilder.build();
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, notification);

I don't understand why onReceive in the MainActivity class is not called. The message "notification received" is not displayed. Can you help me? Thank you :)

dephinera
  • 3,703
  • 11
  • 41
  • 75

1 Answers1

8

I cannot find right now the reason but there's a security reason. Latest Android versions won't allow you to trigger a listener from "kind-of" remote process without it being explicit.

The intent you broadcast MUST be explicit for it to work. Explicit means that you have to explicitly call the component that will handle the intent (the receiver). So this receiver must be declared in its own class and in the manifest as a <receiver>.

Follow this guy's example in the section Explicit Broadcast Intents http://codetheory.in/android-broadcast-receivers/ and thy will be done.

RonU
  • 5,525
  • 3
  • 16
  • 13
eduyayo
  • 2,020
  • 2
  • 15
  • 35
  • 1
    Yes, it works now when the receiver is defined in the manifest. Thank you :) To achieve my goal I needed to use another receiver in the MainActivity, where I load the url. The broadcast to it is sent from the first receiver (the one I defined in the manifest). It works now, but I kind of don't like that approach. It looks to me as a bad practise... – dephinera Aug 11 '15 at 09:58