2016-12-06 133 views
-1

我有一個TimePicker和一個Button,我想設置一個警報,當用戶在指定的時間點擊ButtonBroadcastReceiver延遲觸發

當我點擊按鈕時,它會獲得小時,但有時會在特定時間觸發鬧鐘,但並非總是如此。它在指定的時間內被激發的次數少於未被激發的次數。大多數BroadcastReceiver在指定的時間沒有開火,它會延遲啓動。

這是代碼,我現在所擁有的:

在報警類(代碼refered到廣播接收器)

AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE); 
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class); 
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); 

Calendar cal= Calendar.getInstance(); 

cal.set(Calendar.MONTH,cal.get(Calendar.MONTH)); 
cal.set(Calendar.YEAR,cal.get(Calendar.YEAR)); 
cal.set(Calendar.DAY_OF_MONTH,cal.get(Calendar.DATE)); 
cal.set(Calendar.HOUR_OF_DAY,hour); 
cal.set(Calendar.MINUTE,minutes); 


alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1000 * 60 * 5, alarmIntent); 

其中hourminutes是從TimePicker檢索小時和分鐘。

在AlarmReceiver類

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("prove", "We enter on BroadcastReceiver"); 
    } 
} 

上的Manifest.xml

<receiver 
    android:name=".AlarmReceiver" 
    android:enabled="true" > 
</receiver> 

例如,我已經把日誌,看看我是從TimePicker檢索顯示日誌之前什麼時候BroadcastReceiver。我點擊它在16:48(在TimePicker),這是結果:

12-06 16:47:02.951 7980-7980/com.project.user.project D/prove: hour: 16:48 
12-06 16:50:23.727 7980-7980/com.project.user.project D/prove: We enter on BroadcastReceiver 
12-06 17:00:01.070 7980-7980/com.project.user.project D/prove: We enter on BroadcastReceiver 

正如你所看到的,BroadcastReceiver已經在16:5017:00發射兩枚時候,我想他們應該開火16:4816:53因爲我已經確定它們之間會延遲5分鐘,而不是在這種情況下10分鐘。

那麼,我能做些什麼來在準確的時間點火,而不是延遲點火呢?我是否缺少一些配置?

在此先感謝!

回答

1

如前所述in the documentationsetRepeating是不精確的。

從API 19開始,所有重複的警報都是不精確的。如果您的應用 需要精確的交貨時間,那麼它必須使用一次性精確警報,如上所述每次重新計劃 。舊的應用程序,其 targetSdkVersion比API 19較早將繼續擁有所有的 其警報,包括重複報警,如精確的處理

所以,火在準確的時間作爲API 19的報警,使用setExact ,並在每個鬧鐘內設置下一個鬧鐘。

安排一個報警,在規定的時間準確發送。

+0

我有一個問題,如果我有一個報警,應該在確切的時間重複兩到三次。例如,在'16:48','16:50'和'16:52'。我應該添加三個調用'setExact'函數的事件嗎? –

+0

如果你想設置3組報警,他們沒有特定的模式,那麼我相信你應該使用'setExact'三次,是的。否則,如果您希望鬧鐘每2分鐘觸發一次(例如),則只需使用setExact一次並重新安排在接收器中,如上所述。 – MohanadMohie

+0

是的,他們將有一個特定的模式,例如,每2分鐘。但是我不明白他們說'重新安排'的意思。 –

0

使用setInexactRepeating

alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), 1000 * 60 * 5, alarmIntent); 

你可以檢查我的代碼我在我的app.I做的工作完美。

pendingIntent = PendingIntent.getBroadcast(this, _id, myIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeToAlarm, AlarmManager.INTERVAL_DAY, pendingIntent); 

願它幫助..

+0

如果任何其他查詢超過請告訴 – Kush

+0

但我需要在指定的時間精確的報警。並且在文檔https://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int,long,long,android.app.PendingIntent)中說明了以下內容:'安排一個不精確的重複警報觸發時間要求;例如,每小時重複一次,但不一定每小時重複一次。「 –

+0

檢查我的代碼.. – Kush