2017-02-02 94 views
1

我使用了AlarmManager來設置時間並期望在將來做一些工作。幾乎情況下它工作正常,沒有問題。但有時(有時候),警報未被解僱。這個問題難以重現,我仍然不知道原因。 我在幾個操作系統版本中遇到過這個問題:4.4,5.1,6.0,6.1,7.0。AlarmManager不穩定

我已經使用WakefulBroadcastReceiver開始與Wakelock服務,但問題仍然存在。

以下是我的安排鬧鐘的代碼。

Intent alarmIntent = new Intent(context, AlarmReceiver.class); 
     alarmIntent.putExtra("todo_id", myTodo.getId()); 
     alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, myTodo.getId(), alarmIntent, PendingIntent.FLAG_ONE_SHOT); 

     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(calendar.getTimeInMillis(), pendingIntent); 
      alarmManager.setAlarmClock(alarmClockInfo, pendingIntent); 
     } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
     } else { 
      alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
     } 


public class AlarmReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     LogUtil.debug("onReceive()"); 
     if (null != intent.getExtras()) { 
      int id = intent.getIntExtra("todo_id", -1); 
      if (id != -1) { 
       Intent myIntent = new Intent(context, AlarmService.class); 
       myIntent.putExtra("todo_id", id); 
       LogUtil.debug("Receiver receive todo id: "+id); 
       startWakefulService(context, myIntent); 
      } 
     } 



    } 
} 





public class AlarmService extends Service { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     LogUtil.debug("Service onStartCommand"); 

     int id = intent.getIntExtra("todo_id", -1); 
     LogUtil.debug("Service receive todo id: " + id); 

     // do some stuff here 


     AlarmReceiver.completeWakefulIntent(intent); 
     return START_REDELIVER_INTENT; 
} 

有沒有人有像我這樣的問題?你的解決方案是什麼? 也許這個問題來自Android SDK,他們讓AlarmManager工作不穩定。

+0

在6.0上試過它得到了同樣的問題,但效果很好沒有7.0 – Akshay

+0

我認爲一些ID爲-1爲你的情況 – Mike

+0

@Mike,你能告訴我更多的細節爲什麼一些ID爲-1? – CauCuKien

回答

1

我有同樣的問題,我通過在AlarmReceiver中完成所有的邏輯來解決這個問題。我還開始在接收器中服務,它保存了我的警報邏輯。但是,一旦我將我的代碼移入警報接收器,它就可以正常工作我的問題是我沒有結束我的服務,它一直在運行,導致一些問題或可能是其他原因,但它解決了我的問題。你應該試着讓我知道這是否有幫助。

+0

我會盡力讓你知道結果。我覺得這是個好主意 – CauCuKien

+0

我應該在AlarmReceiver上獲得喚醒鎖嗎? – CauCuKien

+0

我試圖用你的方式,但也有一些問題。我需要訪問與SQLite相關的東西並調用網絡調用,因此接收者不是一個好的選擇,因爲它在UI線程上運行。 – CauCuKien