1

AlarmManager でのアラームの設定について質問があります。ドキュメントで理解できないものを見つけました (以下を参照)。着信音モードを無音モードと通常モードで交互にトリガーする 10 個のアラームを、すべて異なるトリガー時間で設定したいと思います。デバイスはスリープ状態になり、10 個のアラームがすべて期限切れになると再びアクティブになります。AlarmManager はすぐにアラームをブロードキャストしますか? 10日だけでしょうか(リンガーモードはどうですか)?

アラーム インテントは、このインテント ブロードキャストに蓄積された過去のアラーム イベントの数を示す Intent.EXTRA_ALARM_COUNT と呼ばれる int 型のデータ エクストラで配信されます。電話機がスリープ状態だったために配信されなかった繰り返しアラームは、配信されたときに 1 より大きい数になる場合があります。

4

2 に答える 2

3

最も不明な点の1つは(主にAndroidのドキュメントに「現時点では使用されていない」と記載されているため)、requestCodeが異なる場合はPendingIntentが再利用されないことです。したがって、代わりにリクエストコード0でPIを作成します。

    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

カウンターを実装して、次のような操作を行うことができます。

    PendingIntent pendingIntent = PendingIntent.getService(context, counter, intent, 0); 

これは、同じ問題が発生するSMS配信/送信通知PendingIntentsで機能することを知っています。PendingIntentが再利用され、未処理の通知が複数ある場合、それがどのSMSであったかはわかりません。ただし、これが未処理のアラームPendingIntentでも機能する可能性は十分にあります。

お役に立てれば。

于 2011-02-06T09:51:44.810 に答える
2

私が理解していることから、アラームマネージャでアラームをスケジュールするときは、PendingIntentインスタンスを提供する必要があります。

アラームには、電話がスリープ状態またはロックされている場合でも起動して機能するものと、機能しないものの2種類があります。

また、一度に10個のスケジュールを設定する場合、AlarmManagerは、別のインテントアクションを指定していない限り、既存のスケジュール済み保留中のインテントを新しいものに置き換えます。アラームを使用するときは、常にsqliteデータベースを使用して、あるスケジュールで実行したいジョブをキューに入れてきました。ブザーが鳴ったときにすべて同じインテントを実行したので、そこから一度に1つのアラームをスケジュールします。

EXTRA_ALARM_COUNTエクストラは、繰り返し発生するアラームがスケジュールされていて、ユーザーのデバイスがスリープ状態のときに複数回オフになった場合に機能します。電話がウェイクアップすると、過去にキューに入れられたものはすべて再生されます。この場合、保留中のインテントが起動し、setメソッドを呼び出すときにタイプとしてRTCまたはELAPSED_REALTIMEを使用して構築されたため、アラームがスキップされた回数の値があります。

これは私がAlarmMangerと通常どのように対話するかのサンプルです

protected void scheduleNext(Context context) {
    AlarmManager alarmManager = getAlarmManager();
    Intent intent = new Intent(MyIntent.ACTION_DO_WORK);
    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

    String where = Queue.SCHEDULED_DATE + "= (select min(" + Queue.SCHEDULED_DATE + ") from queue where " + Queue.COMPLETED_DATE + " is null)";
    Cursor cursor = context.getContentResolver().query(Queue.CONTENT_URI, Queue.PROJECTION, where, null, null);

    if (cursor.moveToFirst()) {
        int id = cursor.getInt(cursor.getColumnIndex(Queue._ID));
        long when = cursor.getLong(cursor.getColumnIndex(Queue.SCHEDULED_DATE));
        alarmManager.set(AlarmManager.RTC_WAKEUP, when, pendingIntent);
    }   

    cursor.close();
}
于 2010-12-12T00:26:50.993 に答える