2010-01-14 55 views
9

我有一个应用程序,该应用程序使用AlarmManager设置一个警报,当它启动时它会启动另一个Activity。 AlarmManager接收一个PendingIntent,并在指定的时间到来时产生一个BroadcastReceiver类。我想知道是否有任何方法可以通过进入PendingIntent的Intent对象将参数传递给此BroadcastReceiver?通过Android中的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); 

,我希望能够在广播接收器的的onReceive(上下文,意图)方法来检索ARG1。我认为局部变量my_intent是PendingIntent传递给onReceive的第二个参数,但显然这不太正确。是否有可能以这种方式(使用Intent.putExtra())在Activity和BroadcastReceiver之间传递参数,还是应该使用ContentProvider?

谢谢!

伊娃

回答

1

我有一个应用程序,这台使用AlarmManager,当它熄灭它开始 另一个活动的 报警。

这是不好的形式。如果没有很好的理由(例如,来电),不要弹出此类未公开的活动。如果用户正在做某些事情,比如TXTing,玩游戏或尝试点击电话菜单中的数字,该怎么办?

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

是。但是,请记住,在创建PendingIntent时,您会希望使用PendingIntent.FLAG_UPDATE_CURRENT,以确保您在Intent上提供的任何新增功能实际上都可以使用。

+0

啊,是的,我错过了;我使用闹钟作为调用特定时间的特定活动的途径,当闹钟响起时,我会创建一个通知,用户随时可以随时将其下拉,然后才能调用该活动,以便我不会不要打扰他们正在做的事情。感谢您的回答! – ivcheto

+0

嗯,添加PendingIntent.FLAG_UPDATE_CURRENT作为标志时得到PendingIntent似乎并没有改变任何东西;我仍然没有从我的原始活动中将意图转交给onReceive – ivcheto

+1

的意图您是否在创建PendingIntent之前调用putExtra()?我不知道PendingIntent何时将Intent序列化,但如果它立即执行,创建PendingIntent后调用putExtra()将不起作用。 – CommonsWare

1

是的,我认为这是可能通过基本的Java类型和序列化/ Parceable类型中的任何数据在意向书周围的PendingIntent包裹的临时演员,然后使用传递给Intent的情况下进行检索对广播接收者的接收。你的方法对我来说看起来没问题。

你遇到的问题/错误是什么?是“arg1”实例的Serializable?

+0

我没有收到错误;我只是没有得到传递给我的BroadcastReceiver的onReceive(Context,Intent)方法的意图的捆绑;我假设传递给我的BroadcastReceiver的意图与我在Activity中创建(和填充)的意图是一样的。在这种情况下,我想要传递的任何参数的确是Serializable。 – ivcheto

+0

你能告诉我们你的代码是否有putExtra(..)和getXXXExtra(..)? – Samuh

+1

原来我只是需要把putExtra(...)在创建PendingIntent之前调用。谢谢你的帮助! – ivcheto

9

我有一个类似的问题,但我已经在将它包装到PendingIntent之前首先填充Intent。但正如上面指出的那样,我的问题的答案是我需要使用PendingIntent.FLAG_UPDATE_CURRENT标志。一旦我设置了标志,它就起作用了!我希望这可以帮助别人。 -Jeff

+0

我有这个相同的问题,国旗完全做到了。谢谢! – DanO

+0

你是一个拯救生命的人! –

5
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); 
    } 
} 
相关问题