51

我试图在我的意图中添加一条额外的消息以传递给 AlarmManager 以便稍后触发。我的 onReceive 触发正确,但 extras.getString() 返回 null

设置:

public PendingIntent getPendingIntent(int uniqueRequestCode, String extra) {
    Intent intent = new Intent(this, ActionReceiver.class);
    intent.putExtra("EXTRA", extra);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode,
            intent, 0);
    return pendingIntent;
}

public void setSilentLater(TimeRule timeRule) {
    boolean[] weekdays = timeRule.getReoccurringWeekdays();
    int dayOfWeek = 0;

    for (boolean day : weekdays) {
        dayOfWeek++;
        if (day == true) {
            Calendar cal = Calendar.getInstance();

            AlarmManager alarmManager = (AlarmManager) this
                    .getSystemService(Context.ALARM_SERVICE);

            cal.set(Calendar.DAY_OF_WEEK, dayOfWeek);
            cal.set(Calendar.HOUR_OF_DAY,
                    timeRule.getStartTime().get(Calendar.HOUR_OF_DAY));
            cal.set(Calendar.MINUTE,
                    timeRule.getStartTime().get(Calendar.MINUTE));
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                    cal.getTimeInMillis(), 3600000 * 7, getPendingIntent(0, "RINGER_OFF"));
  }
 }
}

当此触发时,消息为空:

public class ActionReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         Bundle extras = intent.getExtras();
         String message = extras.getString("EXTRA"); //empty        
         if(message == "RINGER_OFF")
         {
             AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
             am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
         }
         else if(message == "RINGER_ON")
         {
             AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
             am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
         }
    }
}
4

2 回答 2

84

更新: 请参阅文森特 Hiribarren 的解决方案


旧答案... Haresh 的代码不是完整的答案... 我使用了一个 Bundle,我尝试不使用 Bundle,但是当我尝试从额外的字符串中获取字符串时,我得到了 null !

在您的代码中,确切的问题在于 PendingIntent !

如果您尝试传递额外的,这是错误的:

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0);

因为0标志是什么会让你头疼

这是正确的做法——指定一个标志!

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);

这可能是一个流行的问题,因为Google 的示例代码忽略了在警报中包含 Extra 的问题。

于 2015-01-28T22:25:40.910 回答
42

我有一些可以帮助其他人的精确度,与Someone Somewhere的解决方案相关联。如果您将自定义 Parcelable 对象作为额外对象传递,操作系统可能无法处理它们,因此会发生内部异常并且您的额外对象会丢失。

使用 Android N,即使PendingIntent.FLAG_UPDATE_CURRENT我无法检索我的自定义 Pacelable 附加功能。

所以我不得不使用系统已知的 Parcelable (like ParcelUuid) 来引用自定义数据库中的一些对象,而不是提供我的整个 Parcelable 对象。

另一种解决方案是将 Parcelable 转换为系统正确识别的字节数组:如何在 Parcel 的帮助下将 Parcelable 编组和解组为字节数组?

于 2017-01-02T15:38:32.377 回答