Получение "java.lang.IllegalArgumentException: не могу использовать FLAG_RECEIVER_BOOT_UPGRADE здесь" в устройстве под управлением Android 2.3.3

У меня есть действие, которое позволяет пользователю планировать событие, выбирая дату и время. Я сделал это с помощью AlarmManager

Intent i=new Intent(context, AlarmReceiver.class);
i.putExtra("status",status);
i.putExtra("mode",mode);
PendingIntent p=PendingIntent.getBroadcast(context, id, i, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarms.set(AlarmManager.RTC_WAKEUP, sched_time, p);

В приемнике вещания запускается новая активность

    @Override
    public void onReceive(Context context, Intent data) {
    // Start the scheduled post
    String status=data.getExtras().getString("status");
    int mode=data.getExtras().getInt("mode");

    Intent i=new Intent(context,PostScheduled.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.putExtra("status", status);
    i.putExtra("mode", mode);

    context.startActivity(i);
}

В эмуляторе этот код работает нормально, но на реальном устройстве (под управлением Android 2.3.3) он вылетает на линии

PendingIntent p=PendingIntent.getBroadcast(context, id, i, PendingIntent.FLAG_CANCEL_CURRENT);

Вот след стека

java.lang.IllegalArgumentException: Can't use FLAG_RECEIVER_BOOT_UPGRADE here
at android.os.Parcel.readException(Parcel.java:1326)
at android.os.Parcel.readException(Parcel.java:1276)
at android.app.ActivityManagerProxy.getIntentSender(ActivityManagerNative.java:2254)
at android.app.PendingIntent.getBroadcast(PendingIntent.java:230)
at com.social.autofunnystatus.ScheduleDialog.onClick(ScheduleDialog.java:158)
at android.view.View.performClick(View.java:2538)
at android.view.View$PerformClick.run(View.java:9152)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method) 

Кто-нибудь знает, что происходит?

2 ответа

Решение

FLAG_RECEIVER_BOOT_UPGRADE флаг является "украшением", прикрепленным ActivityManagerService когда вы конкретно определяете цель трансляции, как вы делаете здесь:

Intent i=new Intent(context, AlarmReceiver.class);

Если бы вы должны были определить действие, например "com.whateveryour.package.is.ACTION_ALARM"и объявить AlarmReceiver в <receiver /> в вашем AndroidManifest.xml - а затем создать Intent как это:

Intent i=new Intent("com.whateveryour.package.is.ACTION_ALARM");
i.putExtra("status",status);
i.putExtra("mode",mode);
PendingIntent p=PendingIntent.getBroadcast(context, id, i,PendingIntent.FLAG_CANCEL_CURRENT);

вы бы избавились от этого надоедливого флага, который блокирует вас.

Это ошибка в Android. В какой-то момент в истории это два флага - FLAG_ACTIVITY_NEW_TASK а также FLAG_RECEIVER_BOOT_UPGRADE - получить то же числовое значение, потому что некоторые разработчики Android изменили одно из своих значений, не проверив, что оно уже занято другим флагом. Последняя версия (4.4), кажется, уже исправлена.

Другие вопросы по тегам