13

10秒ごとに更新通知を送信するためのサンプルコードに従っています。コードは次のとおりであり、のUpdateServiceためにありAppWidgetProviderます。を置くThread.sleep(10*1000);と、サービスループの予想される動作を確認できます。私は明らかに、すぐにトリガーされる根本的に間違った何かを持っています。PendingIntentリスナーにアップデートをブロードキャストするアラームのはずです。

long nextUpdate = 10*1000;
Log.d(TAG, "Requesting next update in " + nextUpdate + " msec." );

Intent updateIntent = new Intent(ACTION_UPDATE_ALL);
updateIntent.setClass(this, UpdateService.class);

PendingIntent pendingIntent = PendingIntent.getService(this, 0, updateIntent, 0);

// Schedule alarm, and force the device awake for this update
AlarmManager alarmManager = (AlarmManager)getBaseContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 
    nextUpdate, pendingIntent);
4

3 に答える 3

22

AlarmManager.setRepeatingは、次のように定義されpublic void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)ます。2番目の引数は、最初に呼び出す必要があるときです。あなたはそれをで始めるように言っていますSystemClock.elapsedRealtime()、それは今です。

于 2010-07-29T02:10:34.560 に答える
16

setRepeating()最初のアラームをすぐに鳴らしたいということです()SystemClock.elapsedRealtime()。最初のアラームをもう一度鳴らしたい場合は、オフセット(SystemClock.elapsedRealtime()+nextUpdate)を追加します。

于 2010-07-29T02:10:52.097 に答える
6

過去の時間のアラームのPendingIntentを作成している場合、すぐに発生します。例-今日の午前8時にアラームをスケジュールしますが、午前11時頃にコードを実行するとすぐに起動します。

解決:

cal.add(Calendar.DATE, 1);

long delay = 24 * 60 * 60 * 1000;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);` 

これにより、翌日の指定された時間(つまり、午前8時)にイベントが発生します。

于 2014-07-04T12:39:54.427 に答える