2013-12-19 81 views
2

這是我看到的最奇怪的情況之一。Android。報警管理器。重複報警不會觸發,並在一段時間後立即觸發所有報警

我有一個應用程序每5分鐘執行一次任務。我設置使用下面的代碼重複報警:

public static final int INTERVAL_SECONDS = 300; 

public void SetAlarm(Context context) 
{ 
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(context, Alarm.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * INTERVAL_SECONDS, pi); // Millisec * Second * Minute 
} 

因此,每隔五分鐘,我想到的是,下面的代碼將運行:

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ""); 
    wl.acquire(); 

    Intent pper = new Intent(context, PushPullService.class); 
    context.startService(pper); 
    Log.d("AlarmReceiver", "Called context.startService from AlarmReceiver.onReceive"); 

    wl.release(); 
} 

我的應用程序清單中的以下權限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

我看到很奇怪的東西。我在意圖的開頭添加了寫入日誌文件。我看到有一種奇怪的模式:

每5分鐘有一些事件(在意向過程的開始時打印到日誌中),但有時我在某個時間段內沒有在日誌文件中看到任何內容,然後我看到許多事件一次。一起(一個接一個地)運行的事件的數量似乎是在沒有事件發生的時間段內我期望出現的事件的數量。

有什麼建議嗎?會是什麼呢?我沒有發現這種行爲的任何證據。也許這是在我自己的設備中的東西?

編輯: 當廣播接收器被激發時,我在日誌中添加了一個打印。我看到每隔五分鐘收到一次廣播,但是這個意圖沒有被執行!

我還添加了一個唯一的ID給每個意向,如由伊爾凡·艾哈邁德提供的,但它並沒有解決這個問題:

Intent i = new Intent(context, Alarm.class); 
i.setData(Uri.parse(String.valueOf(System.currentTimeMillis()))); 
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_GRANT_READ_URI_PERMISSION); 
+0

我認爲問題是廣播接收器可以發佈廣播接收器類和清單文件。 – Harshid

+0

你能解決你的問題嗎?我有類似的問題,找不到解決方案 – Marty

回答

1

你需要在這裏設置一個唯一的ID爲每一個報警..

首先,檢查你的清單,它看起來像這樣,

<receiver android:name="com.example.Somename.Alarm" > 
    <intent-filter> 
     <data android:scheme="timer:" /> 
    </intent-filter> 
</receiver> 

然後,在你setAlarm方法,

Intent i = new Intent(context, Alarm.class); 
i.setData(Uri.parse("timer:" + uniqueId)); 
PendingIntent pi = PendingIntent.getBroadcast(context, uniqueId, i, Intent.FLAG_GRANT_READ_URI_PERMISSION); 

生成時間戳UNIQUEID還是什麼,

編輯

當您使用設置鬧鐘,

am.setRepeating() 

這其實ASIGN說的PendingIntent到OS,且要添加300秒到當前時間,然後恰好在五分鐘後,您的接聽電話和您收到通知...

+0

爲什麼這很重要?獨特的身份證給了我什麼?你認爲我每五分鐘收到一次廣播,但是這個意圖沒有被解僱?如果是這樣,那麼究竟發生了什麼(後來誰發起了這個意圖)? –

+0

使用唯一的ID,您可以設置不會相互覆蓋的不同報警。 –

+0

Android重用未決意圖,重寫它們攜帶的有效載荷。 Irfan是正確的,你必須在創建意圖時使用唯一的ID,以防止覆蓋。我過去也遇到過這個問題。 –