Android无法通过AlarmManager传递intent附加功能

时间:2013-09-06 04:08:46

标签: android broadcastreceiver alarmmanager

我试图在我的意图中添加一条额外的消息,以便传递给稍后触发的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);
         }
    }
}

2 个答案:

答案 0 :(得分:75)

<强>更新 请参阅Vincent 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's sample code忽略了在报警中包含Extra。

答案 1 :(得分:33)

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

使用Android N,即使使用PendingIntent.FLAG_UPDATE_CURRENT),我也无法检索自定义的Pacelable附加内容。

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

另一种解决方案是将Parcelable转换为系统正确识别的字节数组:How to marshall and unmarshall a Parcelable to a byte array with help of Parcel?