簡體   English   中英

Android,BroadCastReceiver中的onReceive被多次調用

[英]Android, onReceive in BroadCastReceiver is being called multiple times

我有一個關於AlarmManagerBroadcastReceiver

我想使用AlarmManager每15分鍾更新一些數據(這不是代碼中的情況,因為我仍然試圖使功能正常工作)但我發現了一些我並不理解的事情。

每次定時器調用onReceive方法時,它會立即被快速調用3-5次, LogCat消息被寫入3-5次。 我的代碼有問題嗎?

碼:

MainActivity類中的方法:

private void setCloseByChecker() {

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Calendar cal=Calendar.getInstance();
    Intent intent = new Intent(this, CloseByReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            this.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);    
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
            cal.getTimeInMillis() + 15000, 15000, pendingIntent);       
}

BroadcastReceiver類:

@Override
public void onReceive(Context context, Intent intent) {     

    Log.i("hello","hello");
}

從文檔中。

如果指定的觸發時間是過去的,則將立即觸發警報,警報計數取決於過去觸發時間相對於重復間隔的距離。

出於測試目的,更改public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)將intervalMillis設置為5分鍾或者其他內容,然后重復該操作。 你還應該收到一個以上的廣播嗎?

另外,從文檔:

此警報繼續重復,直到使用cancel(PendingIntent)明確刪除。

這意味着您應該在每次完成它需要做的事情時取消PendingIntent,否則您可能正在使用遞歸來設置操作,直到您完成它為止。 要檢查這一點,請運行代碼幾分鍾,然后檢查BroadCast ammount是否已增加。 如果是,則在最后一個完成之前開始新的警報。

然后,再次,從相同的文檔:

如果您的應用程序希望允許交付時間漂移以確保警報之間始終至少經過一定的時間間隔,則采用的方法是使用一次性警報,在處理每個警報傳遞時自行安排下一個警報。

你是以某種方式取消它們嗎? 請記住,每當您使用不同的ID(第二個參數)調用setRepeating() ,您將復制警報。

嘗試通過調用alarmManager.cancel(pendingIntent)取消所有警報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM