我正在使用警报管理器稍后调用服务,我想在用户指定的时间更新文件。这种机制很好。我现在需要做的是传递到警报调用它的服务,因为我有多个不同意图的警报,需要在不同的时间做不同的事情。
我理解如何使用bundle传递额外内容,但它似乎不适用于服务。我不能以这种方式传递任何东西,我不断得到null
作为从活动传递到服务的内容。
这是我的1个闹钟的活动代码。
Intent myIntent = new Intent(this, TimerService.class);
Bundle bundle = new Bundle();
bundle.putString("extraData", "FIRST_ALARM");
myIntent.putExtras(bundle);
PendingIntent AmPendingIntent = PendingIntent.getService(this, 0, myIntent, 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, Time2fire, fONCE_PER_DAY, AmPendingIntent);
服务代码:
super.onStart(intent, startId);
String bundleFromActivity = intent.getStringExtra("extraData");
我经常搜索,但我见过的都没有用过。
好的,现在我把它改成了这个: 来自我的活动
Intent intent = new Intent(getApplicationContext(), TimerService.class);
intent.putExtra("someKey", "hifromalarmone");
PendingIntent myIntent = PendingIntent.getService(getApplicationContext(),0,intent, 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, Time2fire, fONCE_PER_DAY, myIntent);
来自我的服务 我现在意识到onstart已被弃用,必须使用onstart命令。
public int onStartCommand(Intent intent, int startId, int flags)
{
super.onStartCommand(intent, flags, startId);
Bundle extras = intent.getExtras();
String data1 = extras.getString("somekey");// intent.getStringExtra("someKey");
return START_STICKY;
}
并猜测....仍然返回null。我在这里失踪了什么?看起来我没有传递正确的东西。
好吧,所以我想通了......经过大量的挖掘和一点好运后,我意识到仅仅更新我意图中的数据是不够的,因为我的原始意图已经在系统中注册了。因此,它从未使用我新传递的数据进行更新。这是关键,(希望有人觉得这很有用) 以下代码行是需要更新的内容 PendingIntent AmPendingINtent = PendingIntent.getService(this,0,myIntent,0); 如果自上次向系统注册以来将最后的0更新为其他内容,则会强制更新意图并传递捆绑包。PendingIntent AmPendingINtent = PendingIntent.getService(this,0,myIntent,654654); //像这样。
答案 0 :(得分:0)
在你的第一个场景中
您使用putExtras:
myIntent.putExtras(bundle);
你应该使用putExtra:
myIntent.putExtra(bundle);
putExtras用于其他目的,例如跨应用程序意图或其他东西
在第二个场景中,您将密钥用于:
"someKey"
然后尝试使用以下方法检索它:
"somekey"
它们与您的null不同。
在一个无耻的插件中,我有一个非常好的架构和干净的OO示例通知和服务:http://blog.blundell-apps.com/notification-for-a-user-chosen-time/