0

我一直在試圖安排一個使用AlarmManager類反覆運行的Android服務,但服務在幾天後不再被調用。本來我一直在使用下面的代碼,試圖做到這一點:使用AlarmManager安排的Android服務在幾天後不再被調用

Intent alarmIntent = new Intent(currentActivity.getApplicationContext(), AlarmReceiver.class); 
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(currentActivity.getApplicationContext(), 
      AppManager.ALARM_PENDING_INTENT_REQUEST_CODE, 
      alarmIntent, 
      PendingIntent.FLAG_CANCEL_CURRENT); 

AlarmManager alarmManager = (AlarmManager)currentActivity.getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      System.currentTimeMillis(), 
      interval, 
      pendingAlarmIntent); 

與接收器:

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context _context, Intent _intent){ 
     Intent serviceIntent = new Intent(_context.getApplicationContext(), PostLocationService.class); 
     _context.getApplicationContext().startService(serviceIntent); 
    } 
} 

這工作了幾天,然後突然停止。所以我改變了代碼,最初向接收者廣播一次,然後在每次服務運行時重新向接收者廣播。我這樣做了以下代碼:

Intent alarmIntent = new Intent(currentActivity.getApplicationContext(),  AlarmReceiver.class); 
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(currentActivity.getApplicationContext(), 
      AppManager.ALARM_PENDING_INTENT_REQUEST_CODE, 
      alarmIntent, 
      PendingIntent.FLAG_CANCEL_CURRENT); 

AlarmManager alarmManager = (AlarmManager)currentActivity.getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, 
      interval, 
      pendingAlarmIntent); 

不幸的是,這有同樣的結果;該服務在幾天後停止執行。

我還註冊了一個接收器,用於設備啓動時重新啓動與上述代碼相同的AlarmManager調用。

我錯過了什麼嗎?對於這種持續重複執行,有沒有比上述任何一種方法更好的方法?

+0

你的服務必須在崩潰的所有報警準確傳遞。使它在啓動和停止時登錄到文件或Web服務器,以便查看它是否崩潰。另外,如果電話重新啓動警報丟失,則需要註冊BroadcastReceiver才能捕獲{android.intent.action.BOOT_COMPLETED},因爲您需要編輯應用程序清單文件。 https://stackoverflow.com/questions/12034357/does-alarm-manager-persist-even-after-reboot –

回答

0

據開發者網站:

注:與API開始19(奇巧)報警交付是不精確的:操作系統將爲了儘量減少喚醒和電池使用SHIFT報警。有新的API支持需要嚴格交付保證的應用程序;請參閱setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。應用其targetSdkVersion比API 19早將繼續看到以前的行爲中,當要求 大段引用

see more

希望這將有助於

+0

大多數情況下AlarmManager.set仍然可以。當您使用set()時,您告訴警報管理員您希望在那段時間發生此操作,但操作系統可以通過決策優化電池壽命或避免觸發過多警報。 –