Android не может передавать намерения, кроме AlarmManager
Я пытаюсь добавить дополнительное сообщение в мое намерение перейти к AlarmManager, который будет запущен позднее. My 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);
}
}
}
Ответы
Ответ 1
У меня есть некоторые точности, которые могут помочь другим, чтобы быть связанным с решением от Someone Somewhere. Если вы передаете пользовательские объекты Parcelable как дополнительные, операционная система не сможет их обработать, поэтому возникает внутреннее исключение и ваши дополнительные элементы теряются.
С Android N, даже с PendingIntent.FLAG_UPDATE_CURRENT
я не могу получить свои дополнительные дополнения Pacelable.
Поэтому мне пришлось использовать систему, известную как Parcelable (например, ParcelUuid
), для ссылки на некоторые объекты в пользовательской базе данных вместо предоставления всего объекта Parcelable.
Другое решение состоит в том, чтобы преобразовать Parcelable в байтовый массив, который корректно распознается системой: как маршалировать и отменять марширование Parcelable в байтовый массив с помощью Parcel?
Ответ 2
ОБНОВЛЕНИЕ: Пожалуйста, смотрите решение Винсента Хирибаррена
Старый ответ... Хэш-код не является полным ответом... Я использовал Bundle, и я пытался без Bundle, но я получал нулевое значение в любом случае, когда я пытался получить строки из дополнительного !!
Точная проблема в вашем коде с PendingIntent!
Это неправильно, если вы пытаетесь передать дополнительно:
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0);
Потому что 0
для флагов это то, что вызовет у вас головную боль
Это правильный способ сделать это - указать флаг!
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Это, вероятно, такая популярная проблема, потому что пример кода Google не включил Extra в Alarm.
Ответ 3
// 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);