2017-05-29 63 views
0

我必須在一天中的不同時間發送3個不同的通知(不同的內容)。 繼官方文檔後,https://developer.android.com/training/scheduling/alarms.html#type, 我能夠在指定的時間發送通知,但在更改每個通知的內容時遇到了一些麻煩。以下是設置通知的方法,並在MainActivity的onCreate()方法中調用。Android調度與廣播接收器重複報警

public void setNotification() { 
    Intent intent = new Intent(this, MyBroadcastReceiver.class); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    for (int id = 0; id < 3; id++) { 
     Calendar calendar = Calendar.getInstance(); 
     // Defining different pendingIntent 
     switch (id){ 
      case 0: 
       calendar.set(Calendar.HOUR_OF_DAY, 9); 
       break; 
      case 1: 
       calendar.set(Calendar.HOUR_OF_DAY, 14); 
       break; 
      case 2: 
       calendar.set(Calendar.HOUR_OF_DAY, 20); 
       break; 
     } 
     if(calendar.getTimeInMillis() < System.currentTimeMillis()){ 
      calendar.add(Calendar.DATE, 1); 
     } 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, id, intent, 0); 
     // setRepeating() schedules an alarm 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 
    } 
} 

我知道我可以使用Intent.putExtra()功能發送數據,可用於識別的意圖,但如果應用程序被殺害這一數據將會丟失。 即使應用程序未運行或應用程序被終止或設備啓動,我也希望它能夠正常工作。讀完一些資料後,我發現我可以使用BOOT_COMPLETE監聽器在設備啓動後設置告警。因爲在onCreate()方法設置的通知,通知顯示,每次我運行應用程序,即使我嘗試用下面的代碼

if(calendar.getTimeInMillis() < System.currentTimeMillis()){ 
      calendar.add(Calendar.DATE, 1); 
     } 

目前的onReceive方法看起來像這樣

public void onReceive(Context context, Intent intent) { 

    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context) 
        .setSmallIcon(R.mipmap.app_icon) 
        .setContentTitle("Title") 
        .setContentText("Message"); 
    Intent resultIntent = new Intent(context, MainActivity.class); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
    stackBuilder.addParentStack(MainActivity.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(0, mBuilder.build()); 
} 

來解決這個我需要幫助決定應該在哪裏放置setNotification()方法,以便它將所有警報註冊一次,以及如何識別哪個意圖即將到來,以便採取適當的行動。一種解決方法是使用意向過濾器定義3個不同的broadcastReceivers,並在創建它們時設置意向URI。這是正確的方式還是有其他簡單的解決方案?

回答

0

如何識別其意圖來,這樣可以 採取相應的操作

您需要設置意圖的行動,以便在廣播接收器

Intent intent = new Intent(this, MyBroadcastReceiver.class); 
intent.setAction("THIS_IS_MY_ACTION"); 

接收數據BOOT_COMPLETE
的情況取消引導中的所有警報,並重置它們。要取消警報請在AlarmManager上撥打cancel(),並使用PendingIntent,您在使用setRepeating()設置警報時使用過相同的PendingIntent

照顧contextINTENT_FLAGS,同時與AlarmManager一起工作。

使用getApplicationContext()上下文和保持,因爲它們會同時取消報警使用request_code的記錄,使用PendingIntent.FLAG_UPDATE_CURRENT

這可能幫助: -

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), request_code, intent, PendingIntent.FLAG_UPDATE_CURRENT) 
1

通知出現每次我運行應用程序,

保留使用SharedPreference的檢查,並只設置如果沒有完成。

而且你的代碼

if(calendar.getTimeInMillis() < System.currentTimeMillis()){ 
    calendar.add(Calendar.DATE, 1); 
} 

應該有點像這樣

Calendar calendar = Calendar.getInstance(); 
// Get the current time in millis 
long currentTime = calendar.getTimeInMillis(); 
// Set the reminder times 
switch(id) { 
    .. 
    .. 
} 
//Get the reminder time in millis 
long intendedTime = calendar.getTimeInMillis(); 

if (intendedTime < currentTime) { 
    // Set from next day and to repeat once a day. 
    // you might consider using calendar.add() for adding one day to the current day 

    calendar.add(Calendar.DAY_OF_MONTH, 1); 
    intendedTime = calendar.getTimeInMillis(); 

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); 
} else { 
    // Set for today and to repeat once a day. 
    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, intendedTime, 
      AlarmManager.INTERVAL_DAY, pendingIntent); 
} 
+0

謝謝您的建議。我會相應地修改我的代碼。 – Ranjan