2012-01-11 76 views
0

我開始尋找在每個小時的時間正好重複的開始IntentService(下午1:00,下午2:00,下午3:00,等等) 。正是在小時開始啓動服務,重複每隔一小時之後

說完看了看文件,我相信使用AlarmManager做,這是最好的做法。

我有一個BootReceiver將開始第一個實例,並在下面的應用我onHandleIntent任務已經重複(例如振動下)之後的下一個鬧鐘設置。我的問題是我無法設置鬧鐘在接下來的一個小時的頂上去了,我怎麼會去嗎?

爲了測試我有報警器響了每3分鐘在下面的代碼

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

我的問題是,我無法設置鬧鐘在下一個小時的頂部關閉,我該怎麼辦呢?

當計算下一個小時的頂部,然後將其用作上AlarmManager的第二個參數setRepeating()

+0

服務需要在每個小時的頂部完全觸發,我是否能夠通過這樣做來保持我需要的準確性。此外,我怎麼會去計算時間時的下一個頂部是的,我會是最好的送行發言權12:00 PM設置一個報警,並從那裏重複報警?抱歉,我發現AlarmManager很難與 – user1001160 2012-01-11 13:08:47

+0

@ user1001160握手:「我能否通過這樣做來保持我需要的準確性」 - 如果您使用「RTC_WAKEUP」或「ELAPSED_REALTIME_WAKEUP」,它會相當準確'。話雖這麼說,Android是不是一個RTOS和時鐘漂移等。「此外,我將如何去計算何時小時的下一個頂部是」 - 使用'java.util.Calendar',因爲這是普通的Java,沒什麼Android獨有。 「我會最好在下午12點設置下一個鬧鐘,並從那裏重複鬧鐘?」 - 我肯定會在這個場景中使用'setRepeating()'。 – CommonsWare 2012-01-11 13:40:12

+0

太好了,我想我已經想通了。感謝您的幫助! – user1001160 2012-01-11 16:30:32

0

你試過RTC_WAKEUP,RTC標誌將觸發報警裝置從休眠狀態喚醒之後。

0

你可以找到一個小時的UTC毫秒時間,這樣的代碼(未測試)

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

然後你可以使用setReapting之一..()AlarmManager隨着時間類型的方法接受UTC時間和INTERVAL_HOUR時間間隔。如果您發送的意圖是固定的,不會因多次調用而造成傷害,因爲每個setRepeating()都會刪除前一個。

相關問題