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

标签 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 不需要接收 Extras。)

public int onStartCommand(Intent intent, int flags, int startId) {
        int notiMode=intent.getIntExtra(AlarmManagerHelper.NOTI_MODE, -1);
}

但是,结果始终为 -1,这意味着没有收到额外信息。

我的代码有什么问题?我在谷歌上搜索了几个小时,但没有希望。

如果您有任何想法,请提供帮助。

提前致谢。

编辑:setAlarm 方法在

公共(public)类 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() 不起作用..

最佳答案

我找到了解决方案。很尴尬..我应该在发布问题之前自己搜索更多...

将 Intent.FILL_IN_DATA 更​​改为 PendingIntent.FLAG_UPDATE_CURRENT,现在效果很好。

不知道为什么,但如果你遇到同样的问题,请尝试这个解决方案:)

关于Android getExtra() 始终获取服务中的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26067860/

相关文章:

android - 如何从 intent 过滤器接收 pdf 文件 - Android

Android通知栏点击不起作用

android - IntentService 不会与 PendingIntent 一起调用

android - 使用 Robolectric 和 Gradle 测试资源文件夹

java - RecyclerView 与 Firebase 搜索在搜索时显示所有产品

android - 屏幕锁定后MediaPlayer无法播放声音

java - 特定时间间隔之间的警报

java - AlarmManager.setAlarmClock() 未在 Android Pie 的右上角显示警报

android - 当用户保持应用程序打开或处于后台时,Webview 丢失记录的用户 session

java - 安卓开发: Is using objects bad practice?