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

Android не может передавать намерения, кроме AlarmManager

Я пытаюсь добавить дополнительное сообщение в мое намерение перейти к AlarmManager, который будет запущен позднее. My onReceive запускает правильно, но extras.getString() возвращает null

Настройка:

public PendingIntent getPendingIntent(int uniqueRequestCode, String extra) {
    Intent intent = new Intent(this, ActionReceiver.class);
    intent.putExtra("EXTRA", extra);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode,
            intent, 0);
    return pendingIntent;
}

public void setSilentLater(TimeRule timeRule) {
    boolean[] weekdays = timeRule.getReoccurringWeekdays();
    int dayOfWeek = 0;

    for (boolean day : weekdays) {
        dayOfWeek++;
        if (day == true) {
            Calendar cal = Calendar.getInstance();

            AlarmManager alarmManager = (AlarmManager) this
                    .getSystemService(Context.ALARM_SERVICE);

            cal.set(Calendar.DAY_OF_WEEK, dayOfWeek);
            cal.set(Calendar.HOUR_OF_DAY,
                    timeRule.getStartTime().get(Calendar.HOUR_OF_DAY));
            cal.set(Calendar.MINUTE,
                    timeRule.getStartTime().get(Calendar.MINUTE));
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                    cal.getTimeInMillis(), 3600000 * 7, getPendingIntent(0, "RINGER_OFF"));
  }
 }
}

Когда это триггеры, сообщение пусто:

public class ActionReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         Bundle extras = intent.getExtras();
         String message = extras.getString("EXTRA"); //empty        
         if(message == "RINGER_OFF")
         {
             AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
             am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
         }
         else if(message == "RINGER_ON")
         {
             AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
             am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
         }
    }
}
4b9b3361

Ответ 1

У меня есть некоторые точности, которые могут помочь другим, чтобы быть связанным с решением от Someone Somewhere. Если вы передаете пользовательские объекты Parcelable как дополнительные, операционная система не сможет их обработать, поэтому возникает внутреннее исключение и ваши дополнительные элементы теряются.

С Android N, даже с PendingIntent.FLAG_UPDATE_CURRENT я не могу получить свои дополнительные дополнения Pacelable.

Поэтому мне пришлось использовать систему, известную как Parcelable (например, ParcelUuid), для ссылки на некоторые объекты в пользовательской базе данных вместо предоставления всего объекта Parcelable.

Другое решение состоит в том, чтобы преобразовать Parcelable в байтовый массив, который корректно распознается системой: как маршалировать и отменять марширование Parcelable в байтовый массив с помощью Parcel?

Ответ 2

ОБНОВЛЕНИЕ: Пожалуйста, смотрите решение Винсента Хирибаррена


Старый ответ... Хэш-код не является полным ответом... Я использовал Bundle, и я пытался без Bundle, но я получал нулевое значение в любом случае, когда я пытался получить строки из дополнительного !!

Точная проблема в вашем коде с PendingIntent!

Это неправильно, если вы пытаетесь передать дополнительно:

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0);

Потому что 0 для флагов это то, что вызовет у вас головную боль

Это правильный способ сделать это - указать флаг!

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Это, вероятно, такая популярная проблема, потому что пример кода Google не включил Extra в Alarm.

Ответ 3

// before replace code 
    Bundle extras = intent.getExtras();
    String message = extras.getString("EXTRA");
// after replace code 
     String message = intent.getStringExtra("EXTRA");

                     OR

// before replace code 
   Intent intent = new Intent(this, ActionReceiver.class);
   intent.putExtra("EXTRA", extra);
// after replace code 
   Intent intent = new Intent(this, ActionReceiver.class);
   Bundle bundle = new Bundle();
   bundle.putString("EXTRA", extra);
   intent.putExtras(bundle);