getExtra from Intent, запущенный из pendingIntent

Я пытаюсь сделать несколько сигналов тревоги после того, как пользователь выберет что-то со временем из списка и создаст для него уведомление в указанное время. Моя проблема в том, что «showname», которое putExtra в моем намерении не может быть получено на приемнике вещания. Он всегда получает нулевое значение. Именно так я делаю это для большинства своих намерений, но я думаю, что на этот раз, возможно, из-за pendingIntent или BroadReceiver что-то нужно сделать по-другому. Спасибо

Функция, которая отправляет намерение через ожидающее намерение

public void setAlarm(String showname,String time) {

    String[] hourminute=time.split(":");
    String hour = hourminute[0];
    String minute = hourminute[1];
    Calendar rightNow = Calendar.getInstance();
    rightNow.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour));
    rightNow.set(Calendar.MINUTE, Integer.parseInt(minute));
    rightNow.set(Calendar.SECOND, 0);
    long t=rightNow.getTimeInMillis();
    long t1=System.currentTimeMillis();

    try {   

    Intent intent = new Intent(this, alarmreceiver.class);  
    Bundle c = new Bundle();            
    c.putString("showname", showname);//This is the value I want to pass
    intent.putExtras(c);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 12345, intent, 0);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis(),pendingIntent);
    //Log.e("ALARM", "time of millis: "+System.currentTimeMillis());
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

    } catch (Exception e) {
        Log.e("ALARM", "ERROR IN CODE:"+e.toString());
    }
}

И это принимающая сторона

public class alarmreceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();      
    Bundle b = intent.getExtras();
    String showname=b.getString("showname");//This is where I suppose to receive it but its null
    NotificationManager manger = (NotificationManager) context
            .getSystemService(context.NOTIFICATION_SERVICE);

    Notification notification = new Notification(R.drawable.icon,
            "TVGuide Υπενθύμιση", System.currentTimeMillis());
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            new Intent(context, tvguide.class), 0);

    notification.setLatestEventInfo(context, "Το Πρόγραμμα Ξεκίνησε",
            showname, contentIntent);

    notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;

    notification.sound = Uri.parse("file:///sdcard/dominating.mp3");
    notification.vibrate = new long[]{100, 250, 100, 500};
    manger.notify(1, notification);
}           
}

person spagi    schedule 21.05.2010    source источник


Ответы (5)


Если вы измените значение Extra в намерении, то при создании отложенного намерения вы должны использовать флаг PendingIntent.FLAG_CANCEL_CURRENT.

Простым примером будет

PendingIntent pi = PendingIntent.getBroadcast(context, 0,intentWithNewExtras,PendingIntent.FLAG_CANCEL_CURRENT);

Это правильный путь, и он обеспечит реализацию ваших новых ценностей.

Надеюсь, поможет.

person Priyank    schedule 03.10.2010
comment
Похоже, это не работает в виджете с флиппером, по-видимому, после запуска намерения система пытается повторно использовать его, и никаких дополнительных изменений не происходит. - person Necronet; 11.10.2012
comment
Работал для меня, я застрял на несколько часов! - person Ali; 03.12.2012
comment
Доступ к пакету намерений, как обычно? - person Chad Bingham; 08.12.2014
comment
Спасибо. Сэкономил мое время - person Subhasmith Thapa; 18.12.2020

Намерения повторно используются в системе, если только они не отличаются по контексту/действию, как мне кажется. Ссылка на документацию. То есть, если вы уже сконструировали намерение, это намерение также может быть использовано позже.

В качестве отладочного теста вы можете попробовать добавить intent.setAction("" + Math.random()) ниже intent.putExtras(c) и посмотреть, будут ли ваши дополнения получены на другом конце.

Соответствующая документация:

Из-за такого поведения важно знать, когда два Intent считаются одинаковыми для получения PendingIntent. Распространенной ошибкой людей является создание нескольких объектов PendingIntent с намерениями, которые различаются только своим «дополнительным» содержимым, ожидая каждый раз получать разные PendingIntent. Этого не происходит. Части намерения, которые используются для сопоставления, — это те же части, которые определены в Intent.filterEquals. Если вы используете два объекта Intent, которые эквивалентны Intent.filterEquals, вы получите один и тот же PendingIntent для обоих из них.

person aioobe    schedule 21.05.2010
comment
+1, это правильный ответ, его следует принять. Это действительно полезно, спасибо. (Кстати, вы также можете использовать другой код запроса при создании ожидающих намерений с хэшем, что довольно удобно). - person Snicolas; 25.07.2013

используйте разные коды запроса для разных тревожных уведомлений, чтобы избежать перезаписи одного и того же времени будильника.

person Pattabi Raman    schedule 11.10.2011
comment
Это лучший ответ на такие вопросы! Очень простое и красивое решение проблемы. - person Andrey Novikov; 10.03.2012

Вы должны использовать метод intent.putExtra(). Пакет не указан в сегменте дополнительных услуг. ЕСЛИ вы установите строку, вы должны intent.putExtra(<key>, value); попробовать это сделать. Я использовал это.

person nurisezgin    schedule 30.09.2013

У меня была такая же проблема. Я решил это, настроив действие на намерение, как предложил @aioobe здесь, и мое намерение работает как по волшебству.

Вот что я сделал

  ` intent.putExtra("Name", mName);
    intent.putExtra("dateTime", newdate);
    intent.setAction("" + Math.random());`

Надеюсь, это поможет кому-то, удачного кодирования ..! :)

person SKDroid    schedule 12.02.2015