Intent的标志和PendingIntent.getBroadcast

时间:2011-12-21 01:33:02

标签: android android-intent

我的代码中出现了这个异常:

...IllegalArgumentException...Cant use FLAG_RECEIVER_BOOT_UPGRADE here...

查看android源代码似乎无法设置标记到将被触发的Intent:

PendingIntent.getBroadcast(...);

这里是Android源代码:

...
if (type == INTENT_SENDER_BROADCAST) {
    if ((intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0) {
        throw new IllegalArgumentException("Can't use FLAG_RECEIVER_BOOT_UPGRADE here");
    }
}
...

这是我的代码:

Intent myIntent = new Intent(context, MyReceiver.class);
//myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if i remove the comment it doesn't work
PendingIntent pending = PendingIntent.
          getBroadcast(context, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

原因我不清楚,有人可以为我澄清一下吗?

1 个答案:

答案 0 :(得分:4)

当您使用PendingIntent获得getBroadcast()时,此Intent将广播到BroadcastReceivers。它不会用于启动活动。因此,您无法设置任何与活动相关的标志。无论如何,他们在这种背景下没有任何意义。

为什么要在要播放的意图中设置FLAG_ACTIVITY_NEW_TASK?这毫无意义。

Android将Intent用于3个完全不同的目的:

  1. 使用Activity
  2. 开始/沟通
  3. 使用Service
  4. 开始/沟通
  5. 广播到BroadcastReceiver
  6. PendingIntent类提供了3种不同的方法来为这些不同的目的获取PendingIntent:

    1. getActivity()
    2. 的getService()
    3. getBroadcast()
    4. 您需要确保为正确的目的使用正确的方法。

      是的,你可以在PendingIntent中设置与Activity相关的Intent标志,只要你调用getActivity()来获取PendingIntent。