Intent.putExtras не соответствует

У меня странная ситуация с AlarmManager. Я планирую событие с помощью AlarmManager и передаю строку, используя намерение.putExtra. Строка либо молчит, либо вибрирует, и когда приемник срабатывает, телефон должен либо выключить звонок, либо настроить телефон на вибрацию. Оператор журнала каждый раз правильно выводит ожидаемое значение.

        Intent intent;
        if (eventType.equals("start")) {
            intent = new Intent(context, SReceiver.class);
        } else {
            intent = new Intent(context, EReceiver.class);
        }
        intent.setAction(eventType+Long.toString(newId));
        Log.v("EditQT",ringerModeType.toUpperCase());
        intent.putExtra("ringerModeType", ringerModeType.toUpperCase());
        PendingIntent appIntent = PendingIntent.getBroadcast(context, 0,
                intent, 0);

        AlarmManager alarmManager = (AlarmManager) getSystemService     (Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                appIntent);

Приемник, который срабатывает при срабатывании тревоги, также имеет оператор журнала, и я впервые вижу, что оператор выводит ожидаемую строку SILENT или VIBRATE, но для каждого последующего выполнения вывод показывает исходное значение на стороне приемника. Аварийный сигнал выполняется, а затем я изменяю значение для putExtra на противоположную строку, и получатель по-прежнему отображает событие предыдущего значения, хотя вызов из приведенного выше кода показывает, что новое значение было передано. Значение для setAction каждый раз одно и то же.

audioManager = (AudioManager) context.getSystemService(Activity.AUDIO_SERVICE);
Log.v("Start",intent.getExtras().get("ringerModeType").toString());
if (intent.getExtras().get("ringerModeType").equals("SILENTMODE")) {
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
} else {
audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
}

Есть предположения?


person JDM    schedule 16.05.2010    source источник


Ответы (2)


Сам ваш вопрос был задан шесть часов назад .

Если у вас будет несколько PendingIntents одновременно с разными дополнениями, вам нужно будет изменить что-то еще в Intents, например, строку действия или Uri, как описано в связанной с этим проблеме выше.

Если у вас будет только один PendingIntent за раз, но ваши дополнительные могут варьироваться, просто используйте FLAG_UPDATE_CURRENT в своем вызове getBroadcast().

person CommonsWare    schedule 16.05.2010
comment
Означает ли это, что хотя намерение имело место в прошлом, система все равно знает о нем? - person JDM; 17.05.2010
comment
Кажется, это работает, пока телефон не выключается и не перезагружается. Если это произойдет, а затем снова будет вызвано намерение с использованием FLAG_UPDATE_CURRENT, событие не будет запланировано. Есть ли способ проверить, существует ли намерение в его текущем состоянии? - person JDM; 17.05.2010
comment
Означает ли это, что хотя намерение имело место в прошлом, система все равно знает о нем? Да, если вы не используете FLAG_ONE_SHOT. Есть ли способ проверить, существует ли намерение в его текущем состоянии? Нет, но вместо этого попробуйте FLAG_CANCEL_CURRENT или FLAG_ONE_SHOT, в зависимости от того, как вы пытаетесь использовать PendingIntents. - person CommonsWare; 17.05.2010
comment
Я думаю, что FLAG_CANCEL_CURRENT и повторный вызов — хороший выбор. Спасибо за вашу помощь. Ваши книги мне тоже очень понравились. - person JDM; 17.05.2010
comment
Рад слышать это! Оставайтесь с нами, так как в ближайшие 5-7 недель, как только Google отправит FroYo, для них всех будет выпущено множество обновлений. - person CommonsWare; 17.05.2010

Несколько ожидающих намерений:

Intent notificationIntent = new Intent(this, Oconf.class);
notificationIntent.setData(Uri.parse("text"));

Затем onNewIntent (намерение намерения):

String text = intent.getData().toString();
person embo    schedule 31.10.2010