2017-01-02 59 views
1
public int onStartCommand(Intent intent, int flags, int startId) { 

    ... 

    for (int i = 1; i < dayStore.getInt("lessonCount" , 0)+1; i++) { 

     String lesson = dayStore.getString("Lesson" + i , "null"); 
     String lessonWithoutTime = (lesson.substring(6, lesson.length()-6)).replace(".", ""); 

     String lessonTitleRaw = lessonWithoutTime.split(" ")[0]; 
     String lessonTitle = lessonTitleRaw.replace(".", ""); 

     String startTime = lesson.substring(0, 5); 

     //--------------------------------------------------- 

     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTime.substring(0,2))); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.add(Calendar.MINUTE, Integer.parseInt(startTime.substring(3,5))-5); 

     Intent notifications = new Intent(this, StartNotification.class); 

     notifications.putExtra("LessonTitle", lessonTitle); 
     notifications.putExtra("StartTime", startTime); 

     PendingIntent pendingNotifications = PendingIntent.getService(this, 0, notifications, 0); 
     AlarmManager startNotif = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
     startNotif.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingNotifications); 
    } 

    stopSelf(); 

    return super.onStartCommand(intent, flags, startId); 
} 

因此,在上面的代碼中,它經歷了一個「for i」循環,它爲每個課程的開始創建一個AlarmManager。當AlarmManager推移它會打開一個名爲「StartNotification」這比讓這樣的通知服務......AlarmManager在通過calendar.getTimeInMillis()設置時沒有關閉。

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.main_icon) 
      .setContentTitle(lesson) 
      .setTicker(lesson + " starts in 5 minutes") 
      .setContentText(lesson + " from " + startTime + " to " + endTime); 

    mBuilder.setDefaults(Notification.DEFAULT_LIGHTS); 
    mBuilder.setDefaults(Notification.DEFAULT_VIBRATE); 

    NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(this.NOTIFICATION_SERVICE); 
    mNotificationManager.notify(1, mBuilder.build()); 

    stopSelf(); 

的問題是,AlarmManager不工作,也可能是與日曆一個問題。因爲當我將其更改爲此startNotif.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000, pendingNotifications);(從calendar.getTimeInMillis - >System.currentTimeMillis() + 1000)它工作正常,但只適用於第一次報警。雖然你會認爲所有的(在這種情況下是5)警報/通知會同時(1000工廠),但只有第一個。

我知道,所有的報警都被設置,因爲我用Log.D:■廣泛。 日曆具有正確的毫秒數,我已經以許多不同的方式檢查過。

這些都是我的權限:

<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/> 
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 

和服務:

所有你需要一個創建一個 PendingIntent改變線的
<service android:enabled="true" android:name=".Notifications" /> 
    <service android:enabled="true" android:name=".StartNotification" />   
    ... 

回答

0

第一。問題在於,您正在創建具有一些未決意圖的第一個警報,並且在第二個循環(您想爲第二課創建警報的地方)創建您正在使用相同的未決意圖等等。

當兩個不同的報警使用相同的掛起的意圖時,只有最後一個將被設置,然後觸發和前一個從系統中刪除。

你需要爲每個5節課不同的未決意圖。在你的情況下,你需要使用不同的requestCode,因爲你的intents是相同的(PendingIntent不會比較額外的)。簡單的解決方案可能是傳遞for循環的整數i

PendingIntent pendingNotifications = PendingIntent.getService(this, i, notifications, 0); 

您還需要考慮重置這些警報的頻率。如果您認爲同一課程的警報可能會在最近的將來再次設置,請考慮使用待定意圖的flags。原因是更新現有的待定意圖或使用舊意,但重置時間等。因此,也要考慮這一點。

日曆對象的代碼似乎是罰款。只要確保(使用日誌)通過從字符串獲取它們所設置的分鐘和小時是正確的。也許你也可以嘗試下面的代碼來獲得你的語言環境的具體時間。

Calendar calendar = Calendar.getInstance(TimeZone.getDefault()); 
相關問題