2016-08-04 3 views
4

Мое приложение не работает на Android 7. Мой BroadcastReceiver.onReceive метод вызывается, но содержимое aim.getExtras отсутствует. Я проверил, что данные были правильно загружены. Вот фрагмент моего метода onReceive, где в качестве параметра для onReceive передается намерение.Android 7 BroadcastReceiver onReceive intent.getExtras Отсутствующие данные

Bundle bundle = intent.getExtras(); 
textMessage = bundle.getString("TEXT_MESSAGE"); 
ArrayList<MyPhoneNumber> phoneNumbersToText = bundle.getParcelableArrayList("PHONE_NUMBERS"); 

И textMessage, и phoneNumbersToText являются нулевыми.

Вот отрывок из моего файла манифеста:

<receiver android:process=":remote" android:name="com.friscosoftware.timelytextbase.AlarmReceiver"></receiver> 

Вот фрагмент, где данные загружаются:

Intent intent = new Intent(context , AlarmReceiver.class); 
intent.putExtra(Constants.TEXT_MESSAGE, scheduledItem.getMessageToSend()); 
intent.putExtra(Constants.PHONE_NUMBERS, scheduledItem.getPhoneNumbersToText());  

PendingIntent sender = PendingIntent.getBroadcast(context, getRequestCodeFromKey(key), intent, PendingIntent.FLAG_UPDATE_CURRENT); 

// Get the AlarmManager service 
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, selectedDateTime.getTimeInMillis(), sender); 

тот же код работает отлично в Android 6.

Любые мысли на какие изменения требуются здесь для Android 7?

Спасибо

ответ

1

+1, это выглядит, как у вас такая же проблема, как и я. Я записал его на трекер, (https://code.google.com/p/android/issues/detail?id=216581), который вы прокомментировали.

Моим решением было использование SharedPreferences для хранения моего пользовательского объекта. Затем, когда срабатывает будильник, я запускаю следующее, чтобы вытащить объект. tl; dr, я использую GSON для сериализации/десериализации моего пользовательского POJO в/из SharedPrefs как String. Например:

String json = getSharedPrefs(context).getString(NotificationUtility.NEXT_REMINDER_KEY, "No reminder found"); 
    try { 
     Gson gson = new Gson(); 
     Reminder reminder = gson.fromJson(json, Reminder.class); 
     if (reminder != null) { 
      return reminder; 
     } 
    } catch (Exception error) { 
     Log.i(TAG, "Error parsing json: " + error.getMessage(), error); 
     return null; 
    } 
    return null; 

Надеюсь, это поможет вам!

+0

Спасибо, я попробую ваше предложение. Надеюсь, исправить будет. –

+1

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

0

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

} 

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

+0

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

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