【问题标题】:Passing arguments to a BroadcastReceiver through an Intent in Android通过 Android 中的 Intent 将参数传递给 BroadcastReceiver
【发布时间】:2010-01-14 06:30:27
【问题描述】:

我有一个应用程序,它使用 AlarmManager 设置警报,当它关闭时会启动另一个 Activity。当指定时间到来时,AlarmManager 接受一个 PendingIntent 并产生一个 BroadcastReceiver 类。我想知道是否有任何方法可以通过进入 PendingIntent 的 Intent 对象将参数传递给此 BroadcastReceiver?

基本上我想做的是这样的:

Intent my_intent = new Intent(this, BroadcastService.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, my_intent, 0);
my_intent.putExtra("arg1", arg1);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000), pendingIntent);

我希望能够在 BroadcastReceiver 的 onReceive(Context, Intent) 方法中检索 arg1。我认为局部变量 my_intent 将是 PendingIntent 传递给 onReceive 的第二个参数,但显然这不太正确。是否可以以这种方式(使用 Intent.putExtra())在 Activity 和 BroadcastReceiver 之间传递参数,还是应该改用 ContentProvider?

谢谢!

伊娃

【问题讨论】:

    标签: android


    【解决方案1】:

    我遇到了类似的问题,但我已经先填充了 Intent,然后将其包装在 PendingIntent 中。但是,如上所述,我的问题的答案是我需要使用 PendingIntent.FLAG_UPDATE_CURRENT 标志。一旦我设置了标志,它就起作用了!我希望这对其他人有帮助。 -杰夫

    【讨论】:

    • 我遇到了同样的问题,flag 完全做到了。谢谢!
    • 你是救生员!
    【解决方案2】:
    int code=1;
    Intent i2 = new Intent(StartAlarm);
    i2.putExtra("_id",code);
    
    class test extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent arg1) {
            int i=arg1.getIntExtra("_id",-1);
        }
    }
    

    【讨论】:

      【解决方案3】:

      我有一个应用程序,它设置了一个 使用 AlarmManager 发出警报,它启动 另一个 Activity 熄灭时。

      那是不好的形式。不要在没有非常充分理由(例如,来电)的情况下突然弹出这样的活动。如果用户正在做某事,例如发送短信、玩游戏或尝试点击电话菜单中的数字,该怎么办?

      是否可以传参数 活动和活动之间 以这种方式广播接收器 (使用 Intent.putExtra())

      是的。但是,请记住,当您创建 PendingIntent 时,您需要使用 PendingIntent.FLAG_UPDATE_CURRENT,以确保您在 Intent 上提供的任何新附加功能都被实际使用。

      【讨论】:

      • 啊,是的,我说错了;我使用警报作为在特定时间调用特定活动的途径,当警报响起时,我创建一个通知,然后用户可以在方便时下拉该通知,然后才调用该活动,这样我就不会不要打扰他们碰巧在做的事情。感谢您的回答!
      • 嗯,在获取 PendingIntent 时添加 PendingIntent.FLAG_UPDATE_CURRENT 作为标志似乎没有任何改变;我仍然没有从原始 Activity 中的意图到传递给 onReceive 的意图中获得额外内容
      • 您是否在创建 PendingIntent 之前调用了 putExtra()?我不知道 PendingIntent 什么时候序列化 Intent,但如果它立即序列化,那么在创建 PendingIntent 之后调用 putExtra() 将不起作用。
      • 我在创建 PendingIntent 后调用 putExtra()。我正在填充 OnClickListener 中的所有附加内容,因此在首次创建 PendingIntent 时它们可能还没有准备好。也许我最好使用 ContentProvider
      • 你是对的!在将意图包装到 PendingIntent 之前填充意图是可行的。谢谢你的帮助! :)
      【解决方案4】:

      是的,我认为可以在包裹在 PendingIntent 周围的 Intent 的附加部分中传递基本 Java 类型和 Serializable/Parceable 类型的任何数据,然后使用传递给 Broadcastreceiver 的 onReceive 的 Intent 实例检索它们。我觉得你的方法没问题。

      您遇到的问题/错误是什么? “arg1”实例是否可序列化?

      【讨论】:

      • 我没有收到错误消息;我根本没有收到传递给我的 BroadcastReceiver 的 onReceive(Context, Intent) 方法的意图的捆绑包;我假设传递给我的 BroadcastReceiver 的意图与我在 Activity 中创建(和填充)的意图相同。在这种情况下,我想传递的任何参数确实是可序列化的。
      • 你能告诉我们你的代码有/有 putExtra(..) 和 getXXXExtra(..) 吗?
      • 原来我只需要在创建 PendingIntent 之前进行 putExtra(...) 调用。感谢您的帮助!
      • 你会接受任何答案,还是至少要投票赞成任何答案?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2013-02-12
      相关资源
      最近更新 更多