Я пытаюсь сделать некоторые предупреждения после того, как пользователь выбирает что-то со временем из списка, и создайте уведомление для него в данное время. Моя проблема состоит в том что "showname" что putExtra на моем Поглощенном наклоне быть полученной в бытовом радиоприемнике. Это всегда получает нулевое значение. Это - способ, которым я делаю это для большинства своих намерений, но я думаю на этот раз, возможно, из-за pendingIntent или broadcastReceiver, что-то должно быть сделано differentelly.Спасибо
Функция, которая отправляет Намерение через незаконченное намерение
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);
}
}
Намерения повторно используются в системе, если, как мне кажется, они не отличаются по контексту / действию. Ссылка на документацию . То есть, если вы уже создали намерение, это намерение можно использовать и позже.
В качестве отладочного теста вы можете попробовать добавить intent.setAction ("" + Math.random ())
ниже intent.putExtras (c)
и посмотреть, есть ли у вас экстры принимаются на другом конце.
Соответствующая документация :
Из-за такого поведения важно знать, когда два намерения считаются одинаковыми для целей получения PendingIntent. Распространенной ошибкой, которую допускают люди, является создание нескольких объектов PendingIntent с намерениями, которые различаются только своим «дополнительным» содержимым, ожидая каждый раз получать другой PendingIntent. Так не бывает. Для сопоставления используются те же части Intent, которые определены в Intent.filterEquals. Если вы используете два объекта Intent, эквивалентных Intent.filterEquals, то вы получите одно и то же PendingIntent для них обоих.