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