2013-09-06 2 views
29

Я пытаюсь добавить дополнительное сообщение в мое намерение перейти к AlarmManager, который будет запущен позднее. Мой OnReceive триггеры правильно, но extras.getString() возвращает нулевоеAndroid не может передавать намерения, но AlarmManager

установки:

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

Можете ли вы опубликовать свой класс TimeRule? – Patrick

ответ

60

Haresh является не полный ответ ... Я использовал Bundle, и я пробовал без Bundle, но я получил нулевой способ, когда пытаюсь получить строки из дополнительных!

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

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

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

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

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

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

Это, вероятно, такая популярная проблема, потому что Google's sample code пренебрегли включить Экстра в в качестве сигнала тревоги.

+1

Большое вам спасибо за это! – Marty

+1

Вы спаситель жизни! ** claps ** – Varundroid

+1

Абсолютно спаситель жизни! –

-1
// 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); 
+1

См. Ниже. В ожидании намерения нужен еще один флаг, чтобы нести дополнительные функции. – markshiz

20

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

С Android N, даже с PendingIntent.FLAG_UPDATE_CURRENT) Я не могу получить мои пользовательские дополнительные функции для устранения неполадок.

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

Другим решением является преобразование Parcelable в массив байтов, который корректно распознается системой: How to marshall and unmarshall a Parcelable to a byte array with help of Parcel?

+6

Все ответы с флагами недостаточны. ** Это **^является правильным. Спасибо. –

+0

Чем отправлять байтовый массив в BroadcastReceiver? – aleksandrbel

+0

@aleksandrbel Добавляйте его как дополнение к своему намерению. Например, у вас есть метод 'putExtra (String name, byte [] value)' on 'Intent'. Затем в вашем 'BroadcastReceiver' вы извлекаете массив байтов из Intent, используя' getByteArrayExtra'. Цель предоставляется вашему получателю с помощью метода 'onReceive'. –

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