Intent 的标志和 PendingIntent.getBroadcast

gwv*_*eri 1 android android-intent

我在我的代码中遇到此异常:

...IllegalArgumentException...Cant use FLAG_RECEIVER_BOOT_UPGRADE here...
Run Code Online (Sandbox Code Playgroud)

查看 android 源代码似乎您无法为将要触发的 Intent 设置标志:

PendingIntent.getBroadcast(...);
Run Code Online (Sandbox Code Playgroud)

这里是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");
    }
}
...
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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);
Run Code Online (Sandbox Code Playgroud)

原因我不太清楚,请问有人可以帮我解释一下吗?

Dav*_*ser 5

当你得到一个PendingIntentusing时getBroadcast(),这个 Intent 将被广播到 BroadcastReceivers。它不会用于启动活动。因此您无法设置任何与活动相关的标志。无论如何,它们在这种情况下没有任何意义。

为什么要设置FLAG_ACTIVITY_NEW_TASK要广播的 Intent?这是没有意义的。

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

  1. 开始/沟通Activity
  2. 开始/沟通Service
  3. 广播至BroadcastReceiver

该类PendingIntent提供了 3 种不同的方法来获取 PendingIntent 以满足这些不同的目的:

  1. 获取活动()
  2. 获取服务()
  3. 获取广播()

您需要确保为正确的目的使用正确的方法。

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