2016-03-21 49 views
1

在我的應用程序中,我想每天完成某個任務,然後完成任務,我希望在不同時間觸發多個通知(這些時間將在執行該任務時計算)。 谷歌搜索後,我發現使用AlarmManager是我的最佳選擇:設置鬧鐘管理器來觸發多個通知

此類提供對系統警報服務的訪問。這些允許您安排您的應用程序在未來的某個時間點運行。當警報響起時,已經註冊的Intent被系統廣播,如果目標應用程序尚未運行,則會自動啓動。註冊的警報在設備處於睡眠狀態時保留(如果在此期間關閉設備,可以選擇將設備喚醒),但如果設備關閉並重新啓動,則會被清除。

我的問題是: 1.通知僅在第一次顯示,而不是在此之後顯示。 2.每當我重新啓動該應用程序並顯示過去的通知時,觸發AlarmManager。

PS:我是一個新手在Android和任何幫助表示讚賞

這裏是我的嘗試:

Funtion在我的活動,從我設立這個報警:

private void handleNotification() { 

    Intent alarmIntent = new Intent(this, AlarmReciever.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 0); 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 
} 

這是我AlarmReciever類:

public class AlarmReciever extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 

    ArrayList<String> times = new ArrayList(); 
    GPSTracker gpsTracker = new GPSTracker(context); 

    //calculate the times arraylist 

    DateFormat format; 
    Date date = null; 
    for (String s : times) { 
     if (hour12) { 
      format = new SimpleDateFormat("hh:mm a", Locale.ENGLISH); 
      try { 
       date = format.parse(s); 
      } catch (ParseException e) { 
      } 
     } else { 
      format = new SimpleDateFormat("hh:mm", Locale.ENGLISH); 
      try { 
       date = format.parse(s); 
      } catch (ParseException e) { 
      } 
     } 
     Intent alarmIntent = new Intent(context, NotificationReciever.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 

     Log.d(Constants.LOG_TAG, calendar.getTime().toString()); 

     if (Build.VERSION.SDK_INT < 19) { 
      alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
     } else { 
      alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
     } 
    } 
} 

}

這是我NotificationReciever類:

public class NotificationReciever extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 

    if (Constants.D) Log.d(Constants.LOG_TAG, "NOTIFICATION RECIEVER"); 

    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context) 
        .setSmallIcon(R.drawable.sc_logo_final) 
        .setContentTitle(context.getResources().getString(R.string.app_name)) 
        .setContentText(context.getResources().getString(R.string.app_name)); 
    Intent resultIntent = new Intent(context, NavigationDrawerActivity.class); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
    stackBuilder.addParentStack(NavigationDrawerActivity.class); 
    stackBuilder.addNextIntent(resultIntent); 
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
    mBuilder.setContentIntent(resultPendingIntent); 
    NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    mNotificationManager.notify(1, mBuilder.build()); 

} 

}

在我AndroidManifest.xml中,

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

     <receiver android:name=".AlarmReciever"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
    <receiver android:name=".NotificationReciever"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

回答

2

首先,這個代碼是最有可能設立一個報警的情況發生在當天的午夜,這幾乎肯定是在過去與當前時間相比,這意味着您將很快收到警報:

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.set(Calendar.MINUTE, 0); 

根據的Javadoc setRepeating()

如果規定的觸發時間是在過去,報警器會立即根據觸發 ,與報警計數多遠的過去 觸發時間與重複間隔有關。

您的鬧鐘不會重複,因爲您使用的國旗INTERVAL_DAY只適用於setInexactRepeating()

如果您想在下一個當天的午夜運行某些操作,那麼您需要在日曆中添加一天。您也可以考慮將秒字段設置爲0。

如果您在每次應用程序啓動時都註冊鬧鐘,則您每次都會收到早期鬧鐘。另外根據javadoc:

如果已經爲同一個IntentSender安排了一個鬧鐘,它將首先取消 。

該警報不重複,因爲您傳遞的時間間隔僅適用於setInexactRepeating()

+0

任何想法爲什麼在其他時間沒有觸發通知? –

+0

是的,編輯我的答案。 –

+0

請清除一件事...我在獲得位置許可後註冊了警報(每次應用程序啓動時都會調用被覆蓋的方法)...所以理想情況下應該在什麼時候註冊警報?我試圖這樣做:http://stackoverflow.com/a/10836555/4451655但它沒有幫助.... –