Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getExtra from Intent launched from a pendingIntent

I am trying to make some alarms after the user selects something with a time from a list and create a notification for it at the given time. My problem is that the "showname" that a putExtra on my Intent cant be received at the broadcast receiver. It always get null value. This is the way I do it for most of my intents but I think this time maybe because of the pendingIntent or the broadcastReceiver something need to be done differentelly. Thank you

The function that sends the Intent through the pending intent

public void setAlarm(String showname,String time) {      String[] hourminute=time.split(":");     String hour = hourminute[0];     String minute = hourminute[1];     Calendar rightNow = Calendar.getInstance();     rightNow.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour));     rightNow.set(Calendar.MINUTE, Integer.parseInt(minute));     rightNow.set(Calendar.SECOND, 0);     long t=rightNow.getTimeInMillis();     long t1=System.currentTimeMillis();      try {         Intent intent = new Intent(this, alarmreceiver.class);       Bundle c = new Bundle();                 c.putString("showname", showname);//This is the value I want to pass     intent.putExtras(c);     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 12345, intent, 0);      AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);     alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis(),pendingIntent);     //Log.e("ALARM", "time of millis: "+System.currentTimeMillis());     Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();      } catch (Exception e) {         Log.e("ALARM", "ERROR IN CODE:"+e.toString());     } } 

And this is the receiving end

public class alarmreceiver extends BroadcastReceiver {  @Override public void onReceive(Context context, Intent intent) {     // Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();           Bundle b = intent.getExtras();     String showname=b.getString("showname");//This is where I suppose to receive it but its null     NotificationManager manger = (NotificationManager) context             .getSystemService(context.NOTIFICATION_SERVICE);      Notification notification = new Notification(R.drawable.icon,             "TVGuide Υπενθύμιση", System.currentTimeMillis());     PendingIntent contentIntent = PendingIntent.getActivity(context, 0,             new Intent(context, tvguide.class), 0);      notification.setLatestEventInfo(context, "Το Πρόγραμμα Ξεκίνησε",             showname, contentIntent);      notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;      notification.sound = Uri.parse("file:///sdcard/dominating.mp3");     notification.vibrate = new long[]{100, 250, 100, 500};     manger.notify(1, notification); }            } 
like image 985
spagi Avatar asked May 21 '10 13:05

spagi


People also ask

What is the difference between intent and PendingIntent?

In conclusion, the general and main difference between Intent and PendingIntent is that by using the first, you want to start / launch / execute something NOW, while by using the second entity you want to execute that something in the future.

Why would you use a PendingIntent?

A Pending Intent specifies an action to take in the future. It lets you pass a future Intent to another application and allow that application to execute that Intent as if it had the same permissions as your application, whether or not your application is still around when the Intent is eventually invoked.

What is intent PendingIntent and sticky intent in android?

Sticky Intent : sticky intents are associated with the android system for the future broadcast events. Pending Intent : Those intent which you want to trigger at some time in future when you application is not alive.

What is PendingIntent getBroadcast?

static PendingIntent. getBroadcast(Context context, int requestCode, Intent intent, int flags) Retrieve a PendingIntent that will perform a broadcast, like calling Context.


1 Answers

If you change the Extra's value in the intent, then while creating the pending intent you should use the flag PendingIntent.FLAG_CANCEL_CURRENT.

A simple example would be

PendingIntent pi = PendingIntent.getBroadcast(context, 0,intentWithNewExtras,PendingIntent.FLAG_CANCEL_CURRENT); 

This is the right way and will ensure that your new values are delivered.

Hope it helps.

like image 153
Priyank Avatar answered Sep 21 '22 07:09

Priyank