Подтвердить что ты не робот

GetExtra от Intent, запущенного из ожидающего

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

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

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

Ответ 1

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

Простым примером может быть

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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