Android无法通过AlarmManager传递意图附加信息

我试图把一个额外的消息,我的意图传递到AlarmManager以后触发。 我的onReceive正确触发,但extras.getString()返回null

build立:

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); } } } 

Solutions Collecting From Web of "Android无法通过AlarmManager传递意图附加信息"

Haresh的代码不是完整的答案…我使用了一个Bundle,而且我尝试了Bundle,但是当我试图从额外的内容中获取string的时候,我得到了null的任何一个方法!

在你的代码中,确切的问题是PendingIntent!

这是错误的,如果你想传递额外的:

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

因为旗子0是什么会导致你头痛

这是正确的方法 – 指定一个标志!

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

这可能是一个很受欢迎的问题,因为Google的示例代码忽略了将Extra添加到闹钟中。

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

使用Android N,即使PendingIntent.FLAG_UPDATE_CURRENT)我无法检索自定义的Pacelable演员。

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

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

 // before replace code Bundle extras = intent.getExtras(); String message = extras.getString("EXTRA"); // after replace code String message = intent.getStringExtra("EXTRA"); OR // before replace code Intent intent = new Intent(this, ActionReceiver.class); intent.putExtra("EXTRA", extra); // after replace code Intent intent = new Intent(this, ActionReceiver.class); Bundle bundle = new Bundle(); bundle.putString("EXTRA", extra); intent.putExtras(bundle);