getExtra из Intent запущен из pendingIntent - PullRequest
38 голосов
/ 21 мая 2010

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

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

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

Ответы [ 5 ]

51 голосов
/ 04 октября 2010

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

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

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

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

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

24 голосов
/ 21 мая 2010

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

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

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

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

9 голосов
/ 11 октября 2011

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

0 голосов
/ 12 февраля 2015

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

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

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

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

0 голосов
/ 30 сентября 2013

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

...