2013-05-05 2 views
0

내 활동에서 사용자가 제공 한 음식 목록을 관리하고 만료시기에 따라 알람을 설정하고 있습니다. 그러나 어떤 이유로 인해 onRecieve에 전달 된 의도는 내가 그것이되어야한다고 생각한 것이 아닙니다.Android getExtras/예상과 다른 의도

예를 들어 사용자가 만기 날짜가 5/8 인 버터를 입력하고 만기가 6/4 인 버터를 입력 한 다음 저장 데이터를 누릅니다. 각 항목에 대해이 메소드가 호출됩니다. 이 메서드를 호출 할 때마다 putExtra를 사용하여 만료 날짜를 저장합니다.

public void setOneTimeAlarm(int daysAfterSet) { 
    //declare intent using class that will handle alarm 
    Intent intent = new Intent(this, FoodExpAlarm.class); 
    //retrieve pending intent for broadcast, flag one shot means will only set once 
    intent.putExtra("expDate", expDate); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
     intent, PendingIntent.FLAG_ONE_SHOT); 
    //params: specify to use system clock use RTC_WAKEUP to wakeup phone for notification, 
    //time to wait, intent 
    alarmMan.set(AlarmManager.RTC_WAKEUP, 
     System.currentTimeMillis() + (daysAfterSet * AlarmManager.INTERVAL_DAY), pendingIntent); 
} 

이 그들이 만료 및 (한 달에 떨어져 만료으로부터) 버터 경보 없음에 근접하기 때문에 하나의 알람이 열매를 설정할 수됩니다. 그런 다음 foodExpAlarm 클래스가 한 번 호출되고 열매에 대한 알림이 올바르게 표시됩니다. 그러나 문제는 다음 번 음식을 입력 할 때 발생합니다. 다음으로 사용자는 베이컨 만료 5/8 및 바나나 5/15를 입력합니다. 이제 setOneTimeAlarm이 다시 두 번 호출되고 (각각에 대해 한 번씩) foodExpAlarm이 베이컨에 대해 한 번 다시 호출됩니다.

그러나 foodExpAlarm에서 전달되는 추가 항목은 베이컨이 아니라 버터에서 가져옵니다. foodExpAlarm은 시간이 경과 한 후에 호출되어야하고 예약 된 시간에 해당하는 보류 인 텐트와 함께 호출되어야하기 때문에 이것은 나에게 이해가되지 않습니다. 그러나 그 의도 (또는 적어도 최소한의 추가 사항)는 모든 식품이 추가 된 순서에만 해당하는 것으로 보이는 경우는 아닙니다.

실행 요약 :

  • 열매를 5/8
  • 을 추가 버터 6/4
  • 저장
  • 올바르게 5/8
  • 바나나를 추가 베이컨 추가
  • 베리 알림을 표시 5/15
  • 저장
  • 버터를 잘못 표시했습니다.

내 질문은 왜 버터가 아닌 베이컨을위한 것입니까? 의도에 대한 나의 이해가 잘못 되었습니까? 이 문제를 어떻게 해결할 수 있습니까?

foodExpAlarm :

public void onReceive(Context context, Intent intent) { 

    Bundle exp = intent.getExtras(); //This gets the extras from butter, not bacon like I want 
    Object temp = exp.get("expDate"); 
    Enter_Foods.expDate = new DateTime(temp); 
    intent.getExtras(); 
    int id = (int) (Enter_Foods.expDate).getMillis(); 
    .... 

    notificationMan = (NotificationManager) context 
      .getSystemService(Context.NOTIFICATION_SERVICE); 
    //i think this gets pending intent from the alarm that called this method 
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, 
     new Intent(context,MainActivity.class), Intent.FLAG_ACTIVITY_NEW_TASK); 
    //creates notification object/icon, and set text to flow across top bar 
    Notification notif = new Notification(R.drawable.ic_launcher, 
     "Food expiring soon", System.currentTimeMillis()); 
    //specify what to display when notification is shown 
    notif.setLatestEventInfo(context, from, message, contentIntent); 
    //use nofication manager to send message to phone, will update if same id 
    notificationMan.notify(id, notif); 
    } 
+0

Activity.setIntent()와 관련이 있다고 생각합니다. 나는 당신이 onNewIntent를 오버라이드하고 새로운 인 텐트를 사용하기 위해 actitiy을 업데이트해야한다고 생각한다. – j2emanue

+0

onRecieve에 전달되는 매개 변수에 영향을 줍니까? – farnett

+0

알림을 설정하는 데 사용하는 코드를 게시하십시오. –

답변

0

난 당신이 충돌을 받고 있다고 생각 때문에 알람 매니저와 의도와 문제. 사용자의 의도는 알람 관리자가 사용하는 의도를 비교하는 방법과 관련하여 동일한 의도로 표시됩니다.이 옵션은 "추가 기능"에서만 달라 지므로 알람이 서로 상충합니다.

일정 알람 : 여기

AlarmManager.set 방법 the documentation에서 인용 한 것입니다. 참고 : 타이밍 작업 (틱, 시간 초과 등) 의 경우 Handler를 사용하는 것이 더 쉽고 훨씬 효율적입니다. 이미 동일한 IntentSender에 대해 예약 된 알람이있는 경우 먼저 이 취소됩니다.

시간이 과거에 발생하면 알람이 즉시 트리거됩니다.이 인 텐트가 이미 (두 의도가 동일 함, filterEquals (인 텐트)로 정의 됨)에 대한 알람이있는 경우 제거되고이 값이 으로 바뀝니다.

그리고 다음 filterEquals(Intent)documentation:

두 의도가 의도 해상도 (필터링)의 목적에 대해 동일한 경우에 결정

. 즉, 해당 작업, 데이터, 유형, 클래스, 및 카테고리가 동일한 경우입니다. 이것은 인 텐트에 포함 된 여분의 데이터 을 비교하지 않습니다.

+0

내 알람이 전혀 트리거되지 않을까요? 알림 트리거와 알람은 예상대로 호출되지만 알림과 함께 전달되는 추가 기능은 알람 호출 순서가 아닙니다. 예를 들어, 알람은 1 일 3 일 2 일 5 일 동안 올바르게 설정되지만 시간순으로 전달되는 대신 (1 일 2 일 3 일 5 일) 알람이 입력 된 순서대로 추가 항목을 전달합니다 그들이 떠날 시간 – farnett

+0

시간이 지남에 따라 여러 개의 알람이 발생합니까? 결국 4 개의 알람이 모두 발생합니까? (나는 당신이 그들에게 일어날 수 있도록 안드로이드의 시간을 바꿀 수 있다고 가정합니다). 귀하의 메모에, 나는 단 2 알람을 트리거하는 2 항목과 2 저장을 참조하십시오. – HalR

+0

예 결국 나는 모든 경고를 받게 될 것입니다. 즉, 음식에 들어가면 곧바로 방아쇠를 당기는 지점에서 내가 말하는 경고입니다. 다른 알람은 6/1 및 5/12 (만료 날짜 3 일 전까지)까지 꺼지지 않습니다. – farnett