2012-01-11 32 views
0

1時間ごと(午後1時、午後2時、午後3時など)に毎時の開始時にIntentServiceを開始することを検討しています。 。正確に時間の開始時にサービスを開始し、その後1時間ごとに繰り返す

ドキュメントを見て、私はこれを行うためにAlarmManagerを使うのがベストプラクティスだと考えています。

私は最初のインスタンス以下のアプリケーションを起動するBootReceiverを持っています。私のonHandleIntentでは、次のアラームはタスクが繰り返された後に設定されます。私の問題は、次の1時間のうちに警報を出すことができないということです。これについてどうすればいいですか?テストのために

私はあなたがRTC_WAKEUPを試してみましたアラームは

public class TimingAndControl extends IntentService 
{ public TimingAndControl() 
{ 
super(TimingAndControl.class.getSimpleName()); 
} 

@Override 
protected void onHandleIntent(Intent intent) 
{ 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |  PowerManager.ACQUIRE_CAUSES_WAKEUP, "VibrateTag"); 
    wakeLock.acquire(); 

    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 

    v.vibrate(300); 

    NextAlarm(); 
} 

private void NextAlarm() 
{ 
Intent intent = new Intent(this, this.getClass()); 
PendingIntent pendingIntent = 
    PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

// The update frequency should often be user configurable. This is not. 

long currentTimeMillis = System.currentTimeMillis(); 
long nextUpdateTimeMillis = currentTimeMillis + 3 * (60 * 1000); 
Time nextUpdateTime = new Time(); 
nextUpdateTime.set(nextUpdateTimeMillis); 

if (nextUpdateTime.hour < 6 || nextUpdateTime.hour >= 18) 
{ 
    nextUpdateTime.hour = 8; 
    nextUpdateTime.minute = 0; 
    nextUpdateTime.second = 0; 
    nextUpdateTimeMillis = nextUpdateTime.toMillis(false) + DateUtils.DAY_IN_MILLIS; 
} 
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC, nextUpdateTimeMillis, pendingIntent); 
} 
@Override 
public void onCreate(){ 
    Toast.makeText(this, "service starting", (10 * 1000)).show(); 
    super.onCreate(); 

} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "service stopping", (10 * 1000)).show(); 
    super.onDestroy(); 
} 



} 

答えて

0

私の問題は、次の1時間のうちにアラームが消えるように設定できないことです。これについてどうすればいいですか?

計算次の1時間の上面は、その後AlarmManagersetRepeating()の2番目のパラメータとしてそれを使用します。

+0

サービスは1時間ごとに正確に起動する必要があります。これを行うことで必要な精度を維持できますか?また、次のトップタイムがいつ計算されるのか、私は次のアラームを12:00 PMに設定し、そこからアラームを繰り返すことをお勧めしますか?申し訳ありませんが、AlarmManagerが – user1001160

+0

@ user1001160で把握するのが非常に難しいと感じています:「RTC_WAKEUP」または「ELAPSED_REALTIME_WAKEUP」を使用すると、「これで必要な精度を維持できますか? '。つまり、AndroidはRTOSではなく、クロックドリフトなどです。「次のトップタイムがいつ計算されるのか - java.util.Calendar'を使用してください。これは普通のJava、何もありませんAndroid固有の"私は12:00 PMに次のアラームを設定し、そこからアラームを繰り返すことをお勧めしますか?" - 私はこのシナリオでは 'setRepeating()'を使っています。 – CommonsWare

+0

偉大な、私はそれを考え出したと思います。あなたの助けに100万こんにちは! – user1001160

0

下のコードでは3分ごとにオフに行く必要があり、RTCフラグは、デバイスがスリープから復帰した後にのみ、アラームをトリガします。

0

あなたはこのようなコードで、次の1時間のUTCミリ秒の時間を見つけることができます(テストしていません)

public static final long utcMillisNextHour() { 
    Time t = new Time(); 
    t.setToNow(); 
    t.hour++; 
    t.minute = 0; 
    t.second = 0; 
    return t.normalize(true); 
} 

その後、あなたはUTCを受け入れ、時間タイプでAlarmManagerのsetReaptingの1 ...()メソッドを使用することができます時間とINTERVAL_HOURの間隔です。あなたが送信している意図が修正されている場合、setRepeating()が以前のものを削除するので、それを複数回呼び出しても害はありません。

関連する問題