2016-06-13 119 views
7

這可能是一個重複的問題,但我仍然面臨着這個問題,希望有一個解決方案。提前致謝。如何每15分鐘運行一次android功能,特別是每天15分鐘的標記?

如何設置鬧鐘管理器運行,以便每隔15分鐘的時間間隔(例如每天8:00,8:15,8:30,8:45,9:00)專門執行該功能不管應用程序啓動的時間如何。

舉一個例子,假設我在7:47開始了我的應用程序主要活動,並且我希望鬧鐘在8:00開始,隨後是8:15,8:30等。 。我應該怎麼做?我真的很感激,如果任何提出了建議..

+0

我認爲你需要設置兩個報警管理器而不是一個。 – pooyan

+0

在Android 6.0及更高版本上這是不切實際的。打盹模式將阻止對時間的精確控制,除非用戶將您的應用添加到電池優化白名單。我強烈建議你設計你的應用程序,以避免需要做任何後臺工作,更不用說這種精確度。 – CommonsWare

+0

@CommonsWare,感謝您的評論,理解這對於Android平臺的更高版本來說是不切實際的,但是我目前正在使用運行在Android 2.3上的專有設備,其中設備將依賴於電源模式,因此該應用將在頂級24×7因此需要有這麼繁瑣的工作,你對這種情況有什麼建議嗎? – XXX

回答

1

你應該設置兩路報警管理r.通過計算剩餘時間到適當的時間(例如上午8:00),設置第一個觸發時間。之後你應該在第一個鬧鐘管理器內創建另一個鬧鐘管理器,每15分鐘觸發一次。

的計算時間設定第一警報管理器使用波紋管代碼:

Calendar c = Calendar.getInstance(); 
int m = calendar.get(Calendar.MINUTE); 
long start = System.currentTimeMillis(); 
int remain=0; 
if (m<15) 
{ 
remain = 15-m; 
} 
else if (m<30) 
{ 
remain = 30-m; 
} 
else if (m<45) 
{ 
remain = 45-m; 
} 
else 
{ 
remain = 60-m; 
} 
remain=start + remain*60*1000// convert it to milisecond and plus it to current time; 

編輯

之後,你可以使用代碼波紋管設置第一報警經理:

AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, FirstReceiver.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
    am.set(AlarmManager.RTC_WAKEUP,remain, pi); 

所以現在在你的FirstReceiver類中做類似下面的事情:

public class FirstReceiver extends BroadcastReceiver 
{ 
//do what ever you want + code bellow to setup second alarm manager 
Intent intent = new Intent(this, SecAlarm.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0); 
AlarmManager am= (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
am.setRepeating(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime(), 
       15*60*60,pendingIntent); 
} 
+0

感謝您的建議,這聽起來像一個可能的解決方案,你有這樣的例子嗎? – XXX

+0

我沒有實現它,但如果你希望它更清晰,我可以帶一些僞代碼。 – pooyan

+0

@XXX我編輯我的答案,顯示如何計算第一個鬧鐘時間。 – pooyan

1

最好設置一個鬧鐘要與一個天間隔

public void setAlarm(Context context) { 
    AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(context, Alarm.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, yourTimeInMilisecond, 24 * 60 * 60 * 1000, pi); // Millisec * Second * Minute 
} 

這裏yourTimeInMillisecond每次都是要設置鬧鐘,就像如果時間你要爲明天上午9時報警,那麼,這將是:

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 9); 
calendar.set(Calendar.MINUTE, 0);  
calendar.add(Calendar.DAY_OF_YEAR, 1); 
long yourTimeInMilisecond = calendar.getTimeInMillis(); 

希望它會爲你工作:)

+0

感謝您的建議,但是,沒有特定的時間來設置鬧鐘,我想在我的活動開始時執行該功能...所以如果我的活動在7:47開始,它仍然不是15分鐘的標記然而,我只希望在8:00銳利時執行該函數。 – XXX

+0

@Neo使用'DateUtils.DAY_IN_MILLIS'將會更清潔,而不是自己計算以毫秒爲單位的時間。 –

-1
PendingIntent pendingIntent = PendingIntent.getBroadcast(
    this.getApplicationContext(), 234324243, intent, 0); 

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 
    + (time limits), pendingIntent); 
+0

一些解釋會很好。 –

+0

沒有任何解釋代碼的功能,或者提出這種方法的任何理由,這個答案是沒有用的。接下來會發生的是,該人員將複製並粘貼代碼並遇到問題,因爲您沒有提供任何解釋。但這是你的第一個答案,所以請看[讓你的答案很棒的一些技巧](http://stackoverflow.com/help/how-to-answer)。 – ishmaelMakitla