알림이 이전 의도 엑스트라를 전달 함


134

이 코드를 통해 BroadcastReceiver 내부에 알림을 작성 중입니다.

String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
        int icon = R.drawable.ic_stat_notification;
        CharSequence tickerText = "New Notification";
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        long[] vibrate = {0,100,200,200,200,200};
        notification.vibrate = vibrate;
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        CharSequence contentTitle = "Title";
        CharSequence contentText = "Text";
        Intent notificationIntent = new Intent(context, NotificationActivity.class);
        notificationIntent.putExtra(Global.INTENT_EXTRA_FOO_ID, foo_id);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

        int mynotification_id = 1;

        mNotificationManager.notify(mynotification_id, notification);

알림을 클릭하면 NotificationActivity가 열리고 활동 내부에서 인 텐트 번들 (예 : 1)에서 foo_id를 검색 할 수 있습니다

그러나 다른 알림이 트리거되고 다시 클릭하면 액티비티는 여전히 인 텐트 번들에서 "오래된"값 (1)을받습니다. clear ()로 번들을 지우려고했지만 동일한 효과가 나타납니다. 내 코드에 sth가 잘못되었다고 생각합니다.


당신은 당신이 의도 대기에서 데이터를 얻는 방법을 말해 줄 수주십시오
user49557

그것이 오래된 엑스트라를 보내고 있다는 것을 깨닫기 위해 심사가 쉬워졌습니다.
Utsav Gupta

답변:


268

보류중인 강도에 대해 동일한 요청 코드를 보내고 있습니다. 이것을 변경하십시오 :

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

에:

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);

동일한 매개 변수를 보내면 의도가 작성되지 않습니다. 그들은 재사용된다.


1
그래서 UNIQUE_INT_PER_CALL은 내가 제공 해야하는 정수입니까? 아니면 어딘가에 선언 된 정적 변수입니까?
BrianM

23
안드로이드 잡았다 # 147 - 그래서 Intent이 그 다른 (통해 엑스트라 putExtra) 같은 재 사용 전 일부 보류 의도 전화에 고유 ID를 제공하지 않았기 때문에 고려 - 끔찍한 API
월마트

당신은 내가 너무 부주의했다는 것을 알고 있습니다. 한 블록에서 어떻게 0을 유지할 수 있는지 생각하는 것만으로도 (내 경우에는) :(
Exigente05

3
이것은 나에게 매우 유용했습니다. 다른 사람들을위한 팁입니다. 동일한 방법으로 알림을 작성하고있을 가능성이 높으므로 새로운 보류 의도의 ID를 원하는 것과 동일하게 설정할 수 있습니다 알림 고유 ID에 사용하십시오!
James McNee

1
@IncrediApp은 PendingIntent.getBroadcast ()와 동일합니다. ?
Shruti

139

또는 다음 코드를 사용하여 PendingIntent를 생성 할 수 있습니다.

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

에 대한 문서에서 PendingIntent.FLAG_UPDATE_CURRENT:

설명 된 PendingIntent가 이미 존재하는 경우이를 유지하면서 추가 데이터를이 새로운 Intent에있는 것으로 대체하십시오. 엑스트라 만 변경되는 인 텐트를 생성하고 이전 PendingIntent를받은 엔터티가 명시 적으로 제공되지 않은 경우에도 새 엑스트라로이를 시작할 수 있는지에 대해서는 신경 쓰지 않아도됩니다.


덕분에 ... 완벽 "PendingIntent.FLAG_UPDATE_CURRENT": 추가 인이 플래그를 위해 일
지브 아메드 Puthawala

1
알람 설정에서 브로드 캐스트 수신기로 상태를 전송하려는 보류중인 의도를 사용하여 나를 위해 일했습니다.
William T. Mallard

(!) 난 그냥 내 사용자에서 알림을 전송하기 전에 내가 이러한 플래그가 정말 무슨 짓을했는지에 대해 알고 싶어 다행이 ... 내 불황을 해결
제임스 앤드류

42

동일한 ID를 전달하고 있습니다. 이런 상황에서는 다음과 같이 고유 한 ID를 만드십시오.

int iUniqueId = (int) (System.currentTimeMillis() & 0xfffffff);

그리고 이것을 다음과 같이 넣으십시오.

PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),iUniqueId, intentForNotification, 0);

3
. 왜 새로운 랜덤 () nextInt ()를 사용하지
exloong

@ hderanga "& 0xfffffff"를 추가하면 위의 int에 무엇을합니까?
AJW

3
@AJW System.currentTimeMillis()는 long을 반환하고의 requestId매개 변수 PendingIntent.getActivity()는 int를 사용합니다. 0xffffffff비트 마스크입니다. 그것에 더 많은 것이 있지만, 간단한 설명은`long & 0xffffffff '를 수행하면 long에서 가장 낮은 32 비트를 제공하고 가장 높은 32 비트를 버리고 기본적으로 32 비트 int로 남겨둔다는 것입니다. 이것은 부호 비트를 뭉치지 않기 때문에 단순히 정수에 캐스트하는 것보다 낫습니다 (int보다 int보다 큰 long을 캐스트하면 부호 비트가 오버플로되고 음수 값으로 감길 수 있습니다) )
Jordan Bondo

8

오랜 시간이 지난 후 가장 좋은 방법을 찾고있는 사람은 PendingIntent.FLAG_UPDATE_CURRENT 를 아래 표시된 마지막 인수로 전달해야 합니다.

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

새로운 고유 ID를 제공 할 필요조차 없습니다.

처음이 아닌 다음에이 작업을 수행해야합니다.


1
그것은 효과가 없습니다. 내가하고있는 일 때문에 여기에 있습니다.
Brill Pappin

처음이 아닌 다음에이 작업을 수행해야합니다.
Gentle

0

모든 알림의 요청 코드는 0입니다. 다음 줄을 변경하십시오.

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

와:

PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0);

1
"System.currentTimeMillis ()"대신 "new Random (). nextInt ()"를 사용하면 어떤 이점이 있습니까?
AJW

random을 사용하면 실수로 동일한 정수 값을 쉽게 다시 생성 할 수 있으므로 이전 의도의 버그를 찾기가 매우 어려워집니다.
Sam

@ AJW 내 경우가있었습니다. 정확히 같은 밀리 초로 2 개의 서로 다른 알림을 만들었으므로 그 중 하나에 잘못된 추가 정보가 있습니다.
artman

0

다른 옵션을 추가하고 싶었습니다.

 PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.