Android getExtra()始终在服务中获取默认值

时间:2014-09-26 20:33:08

标签: android alarmmanager android-pendingintent

我正在发出警报,警报启动服务。我希望服务接收额外数据,所以使用谷歌搜索我将标志设置为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()不起作用..

2 个答案:

答案 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
}