1

ユーザーが日時を選択してイベントをスケジュールできるアクティビティがあります。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) 

誰かが何が悪いのか手がかりがありますか?

4

2 に答える 2

8

これはAndroidのバグです。履歴のある時点で、この2つのフラグ(FLAG_ACTIVITY_NEW_TASKおよびFLAG_RECEIVER_BOOT_UPGRADE)は同じ数値を取得します。これは、一部のAndroid開発者が、別のフラグによって既に取得されていることを確認せずに値の1つを変更したためです。最新バージョン(4.4)ではすでに修正されているようです。

于 2014-04-05T16:02:30.033 に答える
3

フラグは、ここで行うようにブロードキャストターゲットを具体的に定義するときにFLAG_RECEIVER_BOOT_UPGRADE付けられる「装飾」です。ActivityManagerService

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

アクションを定義する場合、たとえば " "を使用して、 -でcom.whateveryour.package.is.ACTION_ALARMを宣言してAlarmReceiverから、次のように作成します。<receiver />AndroidManifest.xmlIntent

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);

あなたはあなたをブロックしているその厄介な旗を取り除くでしょう。

于 2012-04-19T14:33:44.213 に答える