2016-07-04 45 views
2

我正在嘗試使用AlarmManager爲通知設置警報。當用戶選擇一個列表項目時設置警報,所以我試圖每次都設置一個單獨的警報(使用傳遞給pendingIntent的唯一ID)選擇一個列表項目。setExact方法調用被跳過。警報未按預期方式被觸發

用於設置報警代碼:

public static void setAlarm(Context context, Movie movie, Schedule schedule){ 
    Intent arg = new Intent(context, NotifyService.class); 
    arg.putExtra(NotificationHelper.fetch_schedule_id, schedule.getId()); 
    arg.putExtra(NotificationHelper.fetch_movie_id, movie.getId()); 
    PendingIntent pendingIntent = PendingIntent.getService(context.getApplicationContext(), (int) schedule.getId(), arg, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
     am.setExact(AlarmManager.RTC_WAKEUP, schedule.getStart().getTime(), pendingIntent); 
    else 
     am.set(AlarmManager.RTC_WAKEUP, schedule.getStart().getTime(), pendingIntent); 
} 

問題我負責的是呼叫設置(或setExact)方法沒有在時間執行。它的工作一半的時間,但在特定的情況下,像,當用戶點擊兩個或多個列表項,一個後在不到一秒鐘的另一個,那麼只有第一次調用執行和調用剩下的只是忽略。

另外,由於set/setexact方法返回void如果調用方法並設置了警報,則無法調試。現在我必須每次檢查adb shell dumpsys報警

所以,如果有人能告訴我如何安排的警報,使得每次觸發,無論多麼頻繁調用該方法,甚至指導我在正確的方向,這將會是一個很大的幫助。 :)

回答

1

首先,我假設你使用此代碼三星設備棒棒糖以上。在這種情況下,我遇到了同樣的問題,經過大量搜索和解決方法後,我發現三星設備的棒棒糖及以上智能管理器可能是問題所在。該組件可以推遲到熄滅,這是3分鐘後觸發報警管理,如果移動正在電池與屏幕否則關閉它警報管理器工作良好,這就是爲什麼你看到的是,這些方法都沒有時間執行。當然,您可以停用特定應用程序的智能管理器。

  1. 啓動設備
  2. 點擊電池
  3. 點擊應用優化
  4. 列表項
  5. 點擊應用優化的詳細
  6. 三星智能管理器應用程序發現自己的應用中選擇「已禁用的」

但在我的情況下,它沒有工作,沒有禁用智能機經理工作在2個三星設備與棒棒糖。通過重構我的應用程序包的名稱以包含字符串「alert」或「alarm」,例如com.example.alarm.myApplication,「欺騙」智能管理器的工作就是「欺騙」智能管理器。你也可以參考這個link瞭解更多信息。

+0

其實這個問題不是特定設備。我已經在很多設備上測試過該應用,但仍然面臨着這個錯誤。而對於我描述的用例來說,警報根本不會觸發。 –

+0

好吧,也許你有一個不同的錯誤,雖然你會面對我描述的錯誤。另外,你可以附加更多的代碼; – Vasilisfoo