2010-05-21 4 views
36

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

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

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

ответ

23

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

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

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

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

+2

Это правильный ответ ......... – Necronet

+1

+1, это правильный ответ, его следует принять.Это действительно полезно, Thx. (BTW, вы также можете использовать другой код запроса при создании ожидающих намерений, с хешем, это довольно удобно). – Snicolas

50

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

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

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

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

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

+0

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

+3

Работал для меня, я застрял часами! – Ali

+3

Решил проблему 2 часа .... –

9

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

+0

Это лучший ответ на этот вопрос! Очень простое и красивое решение проблемы. –

+0

Согласен, красиво простой обходной путь. – jp36

0

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

0

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^