Android getExtra from Intent 从pendingIntent 启动
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2882459/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
getExtra from Intent launched from a pendingIntent
提问by spagi
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
我试图在用户从列表中选择带有时间的内容并在给定时间为其创建通知后发出一些警报。我的问题是广播接收器无法接收到我 Intent 上的 putExtra 的“showname”。它总是得到空值。这是我大多数意图的方式,但我认为这次可能是因为 pendingIntent 或 broadcastReceiver 需要以不同的方式完成某些事情。谢谢
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);
}
}
回答by Priyank
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.
如果您更改 Intent 中 Extra 的值,那么在创建待处理 Intent 时,您应该使用标志 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.
希望能帮助到你。
回答by aioobe
Intents are reused in the system, unless they differ on context/action I believe. Documentation Link. That is, if you have already constructed an Intent, that intent might be used later as well.
意图在系统中被重用,除非它们在我相信的上下文/动作上有所不同。文档链接。也就是说,如果您已经构建了一个 Intent,那么该 Intent 也可能会在以后使用。
As a debug-test, you could try to add intent.setAction("" + Math.random())
below intent.putExtras(c)
and see if your extras are received in the other end.
作为调试测试,您可以尝试在intent.setAction("" + Math.random())
下面添加intent.putExtras(c)
并查看您的额外内容是否在另一端收到。
Relevant Documentation:
相关文件:
Because of this behavior, it is important to know when two Intents are considered to be the same for purposes of retrieving a PendingIntent. A common mistake people make is to create multiple PendingIntent objects with Intents that only vary in their "extra" contents, expecting to get a different PendingIntent each time. This does not happen. The parts of the Intent that are used for matching are the same ones defined by Intent.filterEquals. If you use two Intent objects that are equivalent as per Intent.filterEquals, then you will get the same PendingIntent for both of them.
由于这种行为,为了检索 PendingIntent,了解何时将两个 Intent 视为相同很重要。人们常犯的一个错误是使用 Intent 创建多个 PendingIntent 对象,这些 Intent 仅在其“额外”内容中有所不同,期望每次都获得不同的 PendingIntent。这不会发生。用于匹配的 Intent 部分与 Intent.filterEquals 定义的部分相同。如果您使用两个与 Intent.filterEquals 等效的 Intent 对象,那么您将获得相同的 PendingIntent。
回答by Pattabi Raman
use different request code for different alarm notifications to avoid overwriting of same alarm time.
对不同的报警通知使用不同的请求代码,以避免覆盖相同的报警时间。
回答by nurisezgin
You should use intent.putExtra()
method. Not set bundle to extras segment. IF you set string, you whould intent.putExtra(<key>, value);
Try this it will be done. I used it.
你应该使用intent.putExtra()
方法。未将 bundle 设置为 extras 段。如果你设置了字符串,你应该intent.putExtra(<key>, value);
试试这个它会完成。我用过。
回答by SKDroid
I was had same problem. I solved it with setting an action to intent as suggested by @aioobe here, and my intent works like a magic.
我有同样的问题。我按照@aioobe here 的建议将操作设置为意图解决了这个问题,我的意图就像魔法一样。
Here what i did
这是我所做的
` intent.putExtra("Name", mName);
intent.putExtra("dateTime", newdate);
intent.setAction("" + Math.random());`
Hope it will help someone, happy coding..! :)
希望它会帮助某人,快乐编码..!:)