2012-11-20 126 views
2

所以我有一個BroadcastReceiver它看起來像這樣:Android的報警管理器不工作

public class UpdateReceiver extends BroadcastReceiver { 

    public UpdateReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.SECOND, 10); 
     System.out.println("Broadcast received");  

     PendingIntent operation = PendingIntent.getService(context, 0,new Intent("REFRESH_THAT"), PendingIntent.FLAG_UPDATE_CURRENT);  
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, System.currentTimeMillis(), cal.getTimeInMillis(), operation); 
    } 
} 

這是我如何調用BroadcastReceiver

Intent in = new Intent ("REFRESH_BROADCAST");  
sendBroadcast(in); 

這是Android中我的意圖過濾器Manifest文件

<service android:name = ".services.RefreshService">  
    <intent-filter> 
     <action android:name="REFRESH_THAT"/> 
    </intent-filter> 
</service> 

<receiver android:name=".services.UpdateReceiver">   
    <intent-filter> 
     <action android:name="REFRESH_BROADCAST"/>   
    </intent-filter>  
</receiver> 

BroadcastReceiver收到brodcast沒有任何問題,但AlarmManager似乎什麼都不做。如果我打電話給operation.send()它沒有問題,所以我認爲AlarmManager有什麼問題。

回答

3

好吧,所以最後我找到了解決方案,這是我的錯。

我已經設置int typeAlarmManager.ELAPSED_REALTIMElong triggerAtMillisalarmManager.setInexactRepeating(.....)這是不對的System.currentTimeMillis()屬性,它只能與AlarmManager.RTC/RTC_WAKEUP配對。

所以功能代碼是這樣的:

PendingIntent operation = PendingIntent.getService(context, 0,new Intent("REFRESH_THAT"), 0);  
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() , 30000, operation); 

我真的應該更仔細地閱讀API文檔。如果你盤旋AlarmManager.ELAPSED_REALTIME,它會告訴你什麼樣的時間觸發你必須使用。希望這個愚蠢的錯誤能夠在將來幫助別人。

+0

我不工作的人 –

+0

你有你的BroadcastReceiver設置?如果您遇到問題,我可以提供代碼。但首先請確保,您已將其註冊到Android Manifest中。喜歡我原來的問題。 –

+0

我複製粘貼你的例子,它工作正常。謝謝。但有些事情我似乎不明白。請向我解釋這一行: 'alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime(),30000,operation); ' 這是否意味着在您的情況下,操作會在30秒後發生? 我的意思是它的意思是你的計時器間隔是30s –

0

作爲每setInexactRepeating DOC,第三個參數是:

intervalMillis:間隔在警報的後續重複之間毫秒

然後,你應該放10000毫秒(其是10秒)而不是cal.getTimeInMillis()

alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, cal.currentTimeMillis(), 10000, operation); 

這意味着你的警報將在意圖發射10秒後熄滅,然後每10秒重複一次。當然,因爲你正在使用這種方法,這是不準確的時機。

+0

感謝您的回答,我將嘗試。 –

+0

不幸的是,這也不起作用。最糟糕的是,我沒有得到任何錯誤。所以它看起來好像根本不起作用。它真的讓我瘋了...... –

+0

你怎麼知道'RefreshService'沒有啓動?你在那裏添加了某種記錄嗎?你有沒有使用不精確的時機?您是否考慮使用[setRepeating()](http://developer.android.com/reference/android/app/AlarmManager.html#setRepeating%28int,%20long,%20long,%20android.app.PendingIntent%29) ? – iTurki