我正在发出警报,警报启动服务。我希望服务接收额外数据,所以使用谷歌搜索我将标志设置为Intent.FILL_IN_DATA。以下是我的代码。(仅显示重要部分) (我有几种报警模式,并且调用了不同的服务)
public static void setAlarm(Context mContext, int mode){
if(mode==A){
intent = new Intent(mContext, AService.class);
}
else{
intent = new Intent(mContext, BService.class);
intent.putExtra(NOTI_MODE, mode);
}
PendingIntent pIntent = PendingIntent.getService(mContext, 0, intent,Intent.FILL_IN_DATA);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
Log.d("set alarm","alarm 4.4");
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
} else {
Log.d("set alarm","alarm 4.4 under");
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
}
}
public static void cancelAlarm(Context mContext){
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
PendingIntent pIntent = PendingIntent.getService(mContext, 0, new Intent(mContext, AService.class),Intent.FILL_IN_DATA);
alarmManager.cancel(pIntent);
pIntent = PendingIntent.getService(mContext, 0, new Intent(mContext, BService.class),Intent.FILL_IN_DATA);
alarmManager.cancel(pIntent);
}
服务端代码(编辑:此代码在BService类中.AService不需要接收额外内容。)
public int onStartCommand(Intent intent, int flags, int startId) {
int notiMode=intent.getIntExtra(AlarmManagerHelper.NOTI_MODE, -1);
}
但是,结果始终为-1,表示没有收到额外内容。
我的代码有什么问题?我在谷歌上搜索了几个小时而没有希望。
如果您有任何想法,请提供帮助。
提前致谢。
编辑:setAlarm方法在
公共类AlarmManagerHelper扩展了BroadcastReceiver {}类。
及以下来自AndroidManifest
<receiver android:name="com.example.test.AlarmManagerHelper" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
当我使用
时pIntent = PendingIntent.getService(mContext,0,new Intent(mContext,BService.class),0);
而不是
pIntent = PendingIntent.getService(mContext,0,new Intent(mContext,BService.class),Intent.FILL_IN_DATA);
在cancelAlarm(),服务获取Extras(但当然不会取消警报)
当我更改cancelAlarm()时,我不明白为什么setAlarm()不起作用..
答案 0 :(得分:1)
我找到了解决方案。相当尴尬..我应该在发布问题之前为自己搜索更多......
将Intent.FILL_IN_DATA更改为PendingIntent.FLAG_UPDATE_CURRENT,现在它就像魅力一样。
不知道为什么,但如果您遇到同样的问题,请尝试这个解决方案:)
答案 1 :(得分:0)
根据您发布的代码,您有两项服务(AService和BService)。
我猜你要分享的代码片段是给你的AService吗?
我认为setAlarm方法的顶部应该是:
public static void setAlarm(Context mContext, int mode)
{
if(mode==A)
{
intent = new Intent(mContext, AService.class);
// NOTE: Add this line!
intent.putExtra(NOTI_MODE, mode);
}
else
{
intent = new Intent(mContext, BService.class);
intent.putExtra(NOTI_MODE, mode);
}
// snipped rest of code in this method
}