2010-12-13 8 views
15

現在、アラームマネージャを作成して、指定された時間内にアラームをオフにすることを試みています。まず、私は、ユーザーがその日のために、そのために設定されたアラームがあったかどうかを確認します。毎日コードを実行するために定期的なAlarmManagerを設定する方法

​​

それから私が行くと次の日の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(); 

を誰もが、私は露骨に間違ってやっているか、私は間違ってこれについてつもりです何を参照してください?すべての助けに感謝します。

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); 

この方法では、あなたのServiceAlarmManagerを再設定について心配する必要はありません。

答えて

43

は、私は通常の線に沿ってより多くの何かをします。

私のアプリが起動すると、私の主な活動はonResumeBroadcastReceiverBOOT_COMPLETEDになるように設定されています。

私はService Sを作成し、私自身の経験といくつかのヒント私はGoogleのI/Oの話を見てから取り出さ&トリックに基づいてAlarmManagerを、使用してのガイドを書きました。興味があれば、hereを読むことができます。


以下、あなたの質問に答えるためには、私にできることはすべて、引用the docsです:

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

スケジュール不正確なトリガ時間要件があり、繰り返しアラーム。たとえば、1時間ごとに繰り返されるアラームですが、必ずしも1時間ごとの先頭には表示されません。これらのアラームは、setRepeating(int、long、long、PendingIntent)によって提供される厳密な再帰よりも電力効率が高くなります。システムは、アラームのフェーズを調整して同時に起動させることができます。

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

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

+0

後にアラームを撮影されます!通常、SetInexactRepeatingのオフセット量はどれくらいか分かりますか? – ninjasense

+1

私の答えを編集して 'setInexactRepeating'問題について説明しました。 – Felix

+3

を追加すると、新しい値を設定する前に取り消す代わりに、PendingIntent.FLAG_CANCEL_CURRENTを最後のパラメーターとして取り出すことができます。これは同じ効果があります。 – nsL

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. 
    } 
+0

setInexactRepeatingとsetRepeatingの違いは何ですか? –

+0

http://developer.android.com/reference/android/app/AlarmManager.html –

+1

不正確なトリガ時間要件を持つ繰り返しアラームをスケジュールします。たとえば、1時間ごとに繰り返されるアラームですが、必ずしも1時間ごとの先頭には表示されません。これらのアラームは、setRepeating(int、long、long、PendingIntent)によって提供される厳密な再帰よりも電力効率が高くなります。システムは、アラームのフェーズを調整して同時に起動させることができます。 –

関連する問題