1

これは、Android のアラームで起こっていると私が信じていることの確認 (または反論) を求める投稿です。この話題は、ブログや StackOverflow の投稿で頻繁に出てきますが、この 2 点 (以下) についての明確な説明は見つかりませんでした。

以下のコードは、設定して警告し、設定を解除することを目的としています。それは動作しません。

    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.setAction(AlarmReceiver.ALERT_GUARD_CHECKIN);
    PendingIntent sender = PendingIntent.getBroadcast(context, _id, intent,
            PendingIntent.FLAG_ONE_SHOT);

    AlarmManager am = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, now.getTime().getTime(), sender);

    Intent toCancel = new Intent(context, AlarmReceiver.class);
    toCancel.setAction(AlarmReceiver.ALERT_GUARD_CHECKIN);
    PendingIntent pendingToCancel = PendingIntent.getBroadcast(context,
            _id, toCancel, PendingIntent.FLAG_CANCEL_CURRENT);
    am.cancel(pendingToCancel);

PendingIntent.getBroadast() の最初の呼び出しに PendingIntent.FLAG_ONE_SHOT を渡す代わりに、代わりにゼロを渡すと機能します。この動作が文書化されているとは思いません。

PendingIntent.getBroadast() の 2 番目の引数 (上記の _id) が同一でない場合も、コードは機能しません。これが文書化されているとは思いません。Android ドキュメントでは、2 番目の引数は「送信者のプライベート リクエスト コード (現在は使用されていません)」と記載されています。

問題は、私がこの振る舞いを適切に説明したかどうか、またはこれらの一般化がエピフェノメナであるかどうかです。

4

2 に答える 2

3

アラームの登録に使用したものと同等のaPendingIntentを渡す必要があります。cancel()これは、同じインテント、フラグ、およびリクエストコードを使用することを意味します。ドキュメントがあなたを信じさせるかもしれないものとは反対に、それは実際にリクエストコード値もチェックします。

于 2012-09-25T05:07:03.547 に答える
0

Android マニフェストで定義されたアラームのレシーバーはありますか?

于 2012-09-25T05:01:45.650 に答える