Android 7 намерений нет

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

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

Приложение создает ожидающее намерения с намерением использовать собственный широковещательный приемник с дополнительными функциями. Тем не менее, на android 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 ) все еще получил тот же результат.

Parcelable пользовательского Parcelable в PendingIntent никогда не было особенно надежным, и он не будет работать в AlarmManager PendingIntent на Android 7.0 . Другие процессы, возможно, нуждаются в заполнении значений в Intent , и это включает в себя управление дополнительными функциями, и это невозможно сделать ни в каком процессе, кроме вашего собственного, поскольку никакой другой процесс не имеет вашего настраиваемого класса Parcelable .

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

У меня была аналогичная проблема, но я думаю, что нашел легкое решение. Поместите свои данные в 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"); } } 

Это сработало для меня. Надеюсь, поможет 🙂