7

Кто-нибудь знает, есть ли какие-либо изменения в том, как Android 7.0 (Нуга) обрабатывает намерения по сравнению с Android 6.0 (Lollipop)?Android 7 намерений не хватает

Короче говоря: мое приложение работает по назначению на всех версиях от 4.1 (16) до 6.0 (23), но падает на android 7.0 (24)!

Приложение создает ожидающее намерения с намерением использовать собственный широковещательный приемник, который имеет дополнительные функции. Однако в андроиде 7 ни одна из дополнительных функций не присутствует в намерении, полученном широковещательным приемником.

MainActivity.java

Intent intent = new Intent(context, PollServerReceiver.class); 

// TODO: Remove after DEBUGGING is completed! 
intent.putExtra("TESTING1", "testing1"); 
intent.putExtra("TESTING2", "testing2"); 
intent.putExtra("TESTING3", "testing3"); 

// PendingIntent to be triggered when the alarm goes off. 
final PendingIntent pIntent = PendingIntent.getBroadcast(context, 
      PollServerReceiver.REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

// Setup alarm to schedule our service runs. 
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstRun, freqMilis, pIntent); 

PollServerReceiver.java

Bundle extras = intent.getExtras(); 
Log.d(TAG, "onReceive: TESTING1 = " + extras.getString("TESTING1")); // null here 

// None of the three "TESTING*" keys are there! 
for (String key : extras.keySet()) { 
    Object value = extras.get(key); 
    Log.d(TAG, String.format("onReceive extra keys: %s %s (%s)", key, value.toString(), value.getClass().getName())); 
} 

Стек след, очевидно, дает NullPointerException как причину аварии. Это было бы не так странно, если бы он рухнул среди всех версий, но в этом случае его только последний Android. У кого-нибудь есть идеи, пожалуйста?

Примечание: Я попытался создать ожидающие намерения с различными флагами, включая (0, PendingIntent.FLAG_UPDATE_CURRENT, PendingIntent.FLAG_CANCEL_CURRENT) все еще получил тот же результат.

+2

Я не могу воспроизвести вашу проблему, используя код из вашего вопроса, поэтому я предполагаю, что, возможно, настоящий код не соответствует коду вопроса. В вашем реальном коде есть ли какие-либо ваши дополнительные функции в виде пользовательских классов «Parcelable»? – CommonsWare

+0

Да, кроме трех тестовых дополнений String, я также сохраняю объект Parcelable в том же намерении. Разумеется, он также отсутствует в намерении, полученном на приемнике, а также в дополнительных файлах дерева. – Konaras

+1

24 не позволяет передать объект Parcelable в AlarmManager, http://stackoverflow.com/questions/38466080/dp5-7-0-does-adding-extras-to-a-pending-intent-fail –

ответ

14

Внесение таможни Parcelable в PendingIntent никогда не было особенно надежным, и it flat-out will not work in an AlarmManagerPendingIntent on Android 7.0. Другие процессы, возможно, должны будут заполнить значения в Intent, и это включает в себя манипулирование дополнительными функциями, и это невозможно сделать ни в каком процессе, кроме вашего собственного, поскольку никакой другой процесс не имеет вашего настраиваемого класса Parcelable.

This SO answer имеет обходное решение, в форме преобразования Parcelable непосредственно в/из byte[].

+0

Вы могли бы предоставить для этого некоторый код. –

+0

То же самое с сериализуемым – Lemberg

2

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

Установка сигнализации:

AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);` 
Intent intent = new Intent(context, AlarmReciever.class); 
Bundle bundle = new Bundle(); 

//creating an example object 
ExampleClass exampleObject = new ExampleClass(); 

//put the object inside the Bundle 
bundle.putSerializable("exapmle", exampleObject); 

//put the Bundle inside the intent 
intent.putExtra("bundle",bundle); 

PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

//setup the alarm 
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent); 

Получите тревогу:

public class AlarmReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     // get the Bundle 
     Bundle bundle = intent.getBundleExtra("bundle"); 
     // get the object 
     ExampleClass exampleObject = (ExampleClass)bundle.getSerializable("example"); 
    } 

} 

Он работал нормально для меня. Надеюсь, это поможет :)

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