0

ユーザーがタスクと各タスクのアラームまたは通知を設定できるようにするアプリを作成しようとしています。以下に「setAlarm」メソッドを作成しました。ただし、アラームで複数のタスクを設定するたびに、何らかの理由で以前のタスクがすべてキャンセルされ、最後に設定されたアラームのみが鳴るというエラーがあります。何が問題か知っていますか?私の推測では、「setAlarm」を呼び出すたびに「calendar」インスタンスがリセットされます。どうすればこれを回避できますか?

  public void setAlarm() {
      Intent intent1 = new Intent(NewGoal.this, SingleAlarm.class);
      PendingIntent sender = PendingIntent.getBroadcast(NewGoal.this,
              0, intent1, 0);

      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(System.currentTimeMillis());

      if (alarm_time == 10) {
          calendar.add(Calendar.SECOND, alarm_time);
      } else if (alarm_time == 30 {
          calendar.add(Calendar.SECOND, alarm_time)
      }

      AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
      am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
      Log.i(TEST, "In setAlarm method");
      Log.i(TEST, "calendar=" + calendar.MILLISECOND);
}
4

3 に答える 3

1

ドキュメントから:

同じ IntentSender に対してすでにアラームがスケジュールされている場合は、まずキャンセルされます。

于 2011-02-08T08:44:16.073 に答える
0

ミリ秒の粒度で作業しており、Java ではこれらが正確であることが保証されていないことが原因である可能性があります。以下はJavaDocからのものです。System.nanoTime() を使用する必要があるかもしれませんが、これは Java 5 以降でのみ使用できます。SO でこのスレッドを読んでください: System.currentTimeMillis vs System.nanoTime

現在の時刻をミリ秒で返します。戻り値の時間単位はミリ秒ですが、値の粒度は基盤となるオペレーティング システムに依存し、それよりも大きい場合があることに注意してください。たとえば、多くのオペレーティング システムでは、時間を数十ミリ秒単位で測定します。

また、コードからの以下のステートメントは冗長です

calendar.setTimeInMillis(System.currentTimeMillis());
于 2011-02-08T02:43:13.003 に答える
0

@ dave.c ありがとうございます。これはドキュメントでも見つかりました。これが私がそれを回避した方法です。

  final int intent_id= (int) System.currentTimeMillis();

  Intent intent1 = new Intent(NewGoal.this, AlarmBroadcastReceiver.class);
  PendingIntent sender = PendingIntent.getBroadcast(NewGoal.this, intent_id, intent1, 0); 

同じ名前のインテントが複数ある場合、最新のインテントが前のインテントをキャンセルします。これを回避するには、現在の時刻を使用して各インテントを異なるものにします。

みんなありがとう。

于 2011-02-08T23:34:56.300 に答える