Получение "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), кажется, уже исправлена.