2013-08-20 63 views
1

我已經在服務上設置了重複警報,並且決定從被叫服務中重置警報是最方便的。原因是該服務已經有代碼來檢查它是否在用戶定義的時間表(時間範圍)內。當它超出時間範圍時,它會重置鬧鐘,以在用戶選擇的將來時間開始。也許我正在接近這個錯誤,但我會把這個問題放在那裏,看看你的想法。Android:重置AlarmManager中的重複呼叫服務

//Activity 
Calendar cal = Calendar.getInstance(); 
Intent intent = new Intent(getApplicationContext(), MyService.class); 
intent.setData(Uri.parse("MyService://identifier")); 
PendingIntent pIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0); 
AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE); 
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
      intervalInMins*60000, pIntent); 

的服務有這樣的事情:

的活動創建一個重複報警揭開序幕服務

//Service 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Uri Action = intent.getData(); 
    try { 
     if (Action.equals(Uri.parse("MyService://identifier"))) { 
      //Simplifying the code here: CalculatedOffset is determined from the current time 
      //and scheduled start time. intervalInMins is read from settings. 
      if (!WithinSchedule()) { 
       Calendar cal = Calendar.getInstance(); 
       PendingIntent pIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0); 
       AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE); 
       alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + CalculatedOffset, 
         intervalInMins*60000, pIntent); 
      } 
     } 
    } catch (NullPointerException np) { 
     np.printStackTrace(); 
    } 
    return Service.START_REDELIVER_INTENT; 
} 

我希望重新使用意圖重置重複報警。有了這個新的代碼,我看到在開始時間到來時連續快速發出多個警報。它不應該像這樣出現,但應該像調度重置之前那樣定期開火。我需要在調試器中捕獲它,但尚未能確定確切的條件。我的理解完全是基於這裏的警報嗎?有一個更好的方法嗎?

附錄:此處的一個摺痕是我使用RootTools獲得超級用戶權限,以便解決Android 4.2的飛行模式。這在調度之前並沒有出現問題,但是當警報疊加時,su是否阻塞了很長時間,我很懷疑。

+0

我想知道,在更換重複警報時,創建PendingIntent時是否需要使用PendingIntent.FLAG_CANCEL_CURRENT?我一直在使用0。 – pmont

回答

0

重新使用接收警報的服務內部的意圖確實有效。我已經從使用重複警報切換到每次調用服務時都會重新啓動的單次警報。不幸的是,這並沒有解決報警堆疊的問題。罪魁禍首絕對是封鎖。它可能是RootTools或su本身。我需要將庫從2.6更新到3.x,看看這是否有所作爲。