17

私は現在、毎日指定された時間内にアラームを鳴らすアラームマネージャーを作成しようとしています。まず、ユーザーがその日にアラームを設定しているかどうかを確認します。

      if ((User.getReminderTime(Home.this) > 0)
    && (dt.getDate() != today.getDate() || dt.getDay() != today
      .getDay())) {
   AppointmentManager.setFutureAppointmentCheck(this
     .getApplicationContext());
   User.setLongSetting(this, "futureappts", today.getTime());
  }

次に、実際のアラームを翌日の12時から12時10分までに鳴るように設定します。

     public static void setFutureAppointmentCheck(Context con) {
  AlarmManager am = (AlarmManager) con
    .getSystemService(Context.ALARM_SERVICE);

  Date futureDate = new Date(new Date().getTime() + 86400000);
  Random generator = new Random();

  futureDate.setHours(0);
  futureDate.setMinutes(generator.nextInt(10));
  futureDate.setSeconds(0);

  Intent intent = new Intent(con, FutureAppointmentReciever.class);

  PendingIntent sender = PendingIntent.getBroadcast(con, 0, intent,
    PendingIntent.FLAG_ONE_SHOT);

  am.set(AlarmManager.RTC_WAKEUP, futureDate.getTime(), sender);

 }

これを2分ごとにオフにするテスト環境をセットアップしましたが、正常に機能しているようですが、実際のデバイスに展開すると、受信者がアラームを受信して​​いないようです。デバイスがスリープ状態になっていることが問題である可能性があると考えたため、電源マネージャーを追加しました。しかし、それでも機能しません。

      PowerManager pm = (PowerManager) context
    .getSystemService(Context.POWER_SERVICE);
  PowerManager.WakeLock wl = pm.newWakeLock(
    PowerManager.PARTIAL_WAKE_LOCK, "keepAlive");
  wl.acquire();
  setFutureAppointments(context.getApplicationContext());
  AppointmentManager.setFutureAppointmentCheck(context
    .getApplicationContext());
  User.setLongSetting(context.getApplicationContext(), "futureappts",
    new Date().getTime());
  wl.release();

誰かが私が露骨に間違っていることを見ていますか、それとも私はこれについて間違っていますか?ありとあらゆる助けに感謝します。

4

2 に答える 2

44

私は通常、次のようなことをします。

Intent i = new Intent(this, MyService.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.cancel(pi); // cancel any existing alarms
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
    SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_DAY,
    AlarmManager.INTERVAL_DAY, pi);

AlarmManagerこのように、あなたはあなたのでの再設定について心配する必要はありませんService

私は通常、アプリの起動時(onResumeメインアクティビティ)およびBroadcastReceiverを受信するように設定されているアプリでこのコードを実行しますBOOT_COMPLETED

Serviceの作成と使用に関するガイドを作成しましたAlarmManager。これは、私自身の経験と、Google I/Oの講演を見てから得たいくつかのヒントとコツに基づいています。興味のある方は、こちらからお読みいただけます。


以下の質問に答えるために、私にできることはドキュメントを引用することだけです。

public void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)

トリガー時間の要件が不正確な繰り返しアラームをスケジュールします。たとえば、1時間ごとに繰り返されるアラームですが、必ずしも1時間ごとに繰り返されるとは限りません。これらのアラームは、setRepeating(int、long、long、PendingIntent)によって提供される厳密な繰り返しよりも電力効率が高くなります。これは、システムがアラームのフェーズを調整して同時にアラームを発生させ、デバイスを必要以上にスリープから復帰させないようにするためです。

アラームの最初のトリガーは要求された時間より前ではありませんが、それ以降はほぼ完全な間隔で発生しない可能性があります。さらに、繰り返しアラームの全体的な期間は要求どおりになりますが、アラームが2回連続して発生するまでの時間は異なる場合があります。アプリケーションが非常に低いジッターを要求する場合は、代わりにsetRepeating(int、long、long、PendingIntent)を使用してください。

結論として、それはあまり明確ではありません。ドキュメントには、アラームは「変化する可能性がある」とだけ書かれています。ただし、最初のトリガーは、その後ほぼ完全な間隔で発生しない可能性があることを知っておくことが重要です。

于 2010-12-13T16:36:17.613 に答える
4

これは機能しています。5秒ごとにアラームが鳴ります

private void setRecurringAlarm() {

        Logger.d(IConstants.DEBUGTAG, "Setting Recurring Alarm");

        Calendar updateTime = Calendar.getInstance();

        updateTime.set(Calendar.SECOND, 5);

        Intent alarmIntent = new Intent(this, AlarmReceiver.class);
        PendingIntent recurringDownload = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarms.cancel(recurringDownload);
        alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), 1000 * 5, recurringDownload); //will run it after every 5 seconds.
    }
于 2013-07-24T09:20:13.823 に答える