PendingIntent에서 사용되는“requestCode”는 무엇입니까?


110

배경:

AlarmManager를 통해 알람에 PendingIntent를 사용하고 있습니다.

문제 :

처음에는 이전의 것을 취소하려면 알람을 시작하기 전에 사용했던 정확한 requestCode를 제공해야한다고 생각했습니다.

그러나 취소 API가 말한 것처럼 내가 틀렸다는 것을 알게되었습니다 .

인 텐트가 일치하는 모든 경보를 제거합니다. 의도와 일치하는 모든 유형의 경보 (filterEquals (Intent)로 정의 됨)는 취소됩니다.

" filterEquals "를 보면 문서는 다음과 같이 말합니다.

인 텐트 해결 (필터링)을 위해 두 인 텐트가 동일한 지 확인합니다. 즉, 작업, 데이터, 유형, 클래스 및 범주가 동일한 경우입니다. 이는 인 텐트에 포함 된 추가 데이터를 비교하지 않습니다.

그래서 나는 "requestCode"가 무엇인지 이해하지 못한다.

질문:

"requestCode"는 무엇에 사용됩니까?

동일한 "requestCode"로 여러 알람을 생성하면 어떻게됩니까? 그들은 서로를 무시합니까?


동일한 requestCode를 사용하면 동일한 PendingIntent
pskink

3
PendingIntent.getBroadcast ()의 경우 requestCode는 Android에서 분명히 무시됩니다. API 22부터는 보류중인 인 텐트를 고유하게 만들지 않습니다. getActivity () (그리고 아마도 getService ()에 대해 수행하지만 테스트하지는 않았습니다). stackoverflow.com/a/33203752/2301224
베이커

@Baker 이것은 버그로 간주되지 않습니까? 버그 인 경우 여기에 작성해야합니다. code.google.com/p/android/issues/list
android developer

1
글쎄, 실제로 문서는 requestiCode의 usaga를 지정합니다. If you truly need multiple distinct PendingIntent objects active at the same time (such as to use as two notifications that are both shown at the same time), then you will need to ensure there is something that is different about them to associate them with different PendingIntents. This may be any of the Intent attributes considered by Intent#filterEquals(Intent), or different request code integers supplied.
Eir

@Eir 맞아요, 그래서 requestCode 사용의 요점은 무엇입니까? 어디에서 사용할 수 있습니까?
안드로이드 개발자

답변:


77
  1. requestCode 나중에 동일한 보류중인 인 텐트 인스턴스를 검색하는 데 사용됩니다 (취소 등).
  2. 네, 내 생각 엔 알람이 서로 무시할 것입니다. 요청 코드를 고유하게 유지합니다.

5
경보의 의도가 매우 다른 경우에도 requestCode를 고유하게 설정하는 것입니까 (예 : 서비스 A 용과 서비스 B 용)? 또한 문서가 그것에 대해 아무것도 말하지 않는 이유는 무엇입니까? requestCode가 무엇이든 특정 유형의 모든 경보를 제거 할 수 있습니까?
안드로이드 개발자

1
아니요, 다른 의도에는 필요하지 않습니다. 그리고 문서가 왜 그것에 대해 아무것도 말하지 않는지 모르겠지만 반복 알람을 설정할 때와 동일한 의도를 사용할 때 이것을 배웠습니다.
Minhaj Arfin 2014

2
PendingIntent에 대해 이야기하고있었습니다. startActivityForResult는 정상적인 인 텐트를 사용합니다.
안드로이드 개발자

2
"프록시 활동을 사용하여 PendingIntent가있는 startActivityForResult"의 목적은 무엇입니까? 예를 들어 줄 수 있습니까?
안드로이드 개발자

3
나는 동의한다; PendingIntent 및 AlarmManager에 대한 문서는 총체적입니다. 프로그래밍 방식으로 알람을 나열 할 수 없다는 사실로 인해 더욱 악화되었습니다.
누군가 어딘가에

33

@Minhaj Arfin 답변에 추가하고 싶습니다.

1- requestCode는 나중에 동일한 보류 인 텐트를 가져 오는 데 사용됩니다 (취소 등).

2- 예, PendingIntent에 지정한 것과 동일한 수신자를 Intent에 지정하는 한 무시됩니다.

예:

Intent startIntent1 = new Intent(context, AlarmReceiverFirst.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, startIntent1, 0);

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

위의 예 에서 수신자가 다르기 때문에 서로 덮어 쓰지 않습니다 (AlarmReceiverFirst 및 AlarmReceiverSecond).

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

Intent startIntent3 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 0, startIntent3, 0);

위의 예에서, 그들은 것이다 서로 겹쳐 수신기가 동일하기 때문에 (AlarmReceiverSecond)


Intent startIntent4 = new Intent (context, AlarmReceiverSecond.class); PendingIntent pendingIntent4 = PendingIntent.getService (context, 0, startIntent4, 0); 그럼 괜찮을까요? 내 말은, 이것이 getBroadcast () 대신 getService ()를 호출하기 때문에 재정의되지 않습니까?
Jenix

다른 질문을해서 미안하지만 stackoverflow는 단일 코드 줄없이 질문을 작성하는 것을 허용하지 않기 때문입니다. 위의 예제 코드와 같이 0을 입력했지만 많은 사람들이 0 대신 특정 옵션 값을 입력하는 것을 보았습니다.
Jenix

1
@Jenix uou AlarmReceiverSecond.class의도에 사용하고 PendingIntent.getService(). 때문에 그것은 작동하지 않습니다 AlarmReceiverSecond.classA는 BroadcastReceiver아닌Service
HendraWD

1
플래그에 대해서는 설정할 수있는 속성으로, 제공 한 플래그에 따라 PendingIntent의 동작을 수행합니다. 0 수단 모든 플래그 오프
HendraWD

아 바보 였어요 haha ​​세상에서 무슨 생각을 했어요 .. PendingIntent에 대해 조금 혼란 스러웠고 답변이 정말 도움이되었습니다. 그리고 저는 더 명확하게하고 싶었지만 이제 제 질문이 처음에는 이해가되지 않는다는 것을 깨달았습니다. 감사!
Jenix

2

제 경우에는 두 개의 다른 의도로 동일한 활동을 열고 싶으므로 두 개 이상의 FCMS가 트레이에 있으면 그중 하나는 다른 하나는 열지 않을 것이므로 보류중인 의도의 요청 코드를 변경 한 다음 작동했습니다.

 PendingIntent pendingIntent =
                            PendingIntent.getActivity(this, **Some unique id for all GCMS** /* Request code */, intent,
                                    PendingIntent.FLAG_ONE_SHOT);

내 경우에 대한 코드를 더 확인할 필요가 없었습니다. 어떤 경우에 보류중인 인 텐트 인스턴스가 필요한지 알 수 있습니다. 질문 변경 요청 코드와 관련하여 여러 FCM에이 트레이에 있었다 때이 오류는 무슨 일이 일어나고 이것이 올바른 방법인지 알고 나를 위해 해달라고, 고토 올바른 화면으로 나에게 도움이
JSONParser

그렇다면 필요하지 않은 경우 다른 요청 코드를 설정하는 이유는 무엇입니까?
안드로이드 개발자

ok 자세히 설명하겠습니다. ACTIVITY A가 있습니다. 질문을 표시하기위한 것입니다. 알림에서 ID를 의도를 통해 전달한 다음 해당 ID에 대한 네트워크 요청을 만들고 특정 질문을 가져 오게됩니다. 알림 트레이에 두 개 이상의 알림이 있고 그중 하나를 클릭하면 보류중인 의도 요청 코드를 고유 한 값으로 변경 한 후 첫 번째 GCM에 있던 질문의 ID를 얻습니다. 더 이상 논의가 나는 또한 더 배우고 싶다,이 생각이 필요한 경우 내가 지금 분명히 희망, 당신을 감사합니다
JSONParser

아 그렇지 않으면 전혀 효과가 없었을 거라는 뜻 이었죠? 혼란스러워서 죄송합니다. 이 질문은 오래 전에 요청되었으며 전혀 기억이 나지 않습니다 ...
android developer

1

requestCode앱에 심각한 문제를 일으킬 수있는 한 가지 중요한 점은 위젯을 사용할 때입니다. requestCode동일한 위젯은 전화 재부팅 후 작동하지 않습니다 . 즉, 위젯 pendingIndent에 설정하는 것은 remoteViews고유 한 requestCode, 일반적으로 숫자와 함께 제공되는 widgetId로 설정되어야 함을 의미합니다 .


0

실제로 문서 에는 요청 코드가 사용되는 용도가 명확하게 나와 있습니다.

동시에 활성화 된 여러 개의 고유 한 PendingIntent 개체가 필요한 경우 (예 : 동시에 표시되는 두 개의 알림으로 사용) 서로 다른 개체와 연결하기 위해 다른 개체가 있는지 확인해야합니다. PendingIntents. Intent # filterEquals (Intent)에서 고려하는 Intent 속성 중 하나이거나 getActivity (Context, int, Intent, int), getActivities (Context, int, Intent [], int), getBroadcast ()에 제공된 다른 요청 코드 정수일 수 있습니다. Context, int, Intent, int) 또는 getService (Context, int, Intent, int).

아직 명확하지 않은 것 같으므로 설명해 드리겠습니다.

PendingIntent객체 를 사용하고 싶을 때 인스턴스화하는 것만이 아닙니다. 오히려, 사용자는 사용하는 시스템으로부터 획득 한 PendingIntent정적 메소드 ( getActivity, getBroadcast, getService등). 시스템은 여러 PendingIntent 인스턴스를 유지하고 하나를 제공합니다. 어떤 것을 제공하는지는 이러한 getter 메소드에 전달하는 입력 매개 변수에 따라 다릅니다. 이러한 입력 매개 변수는 Context, 즉 인 텐트의 대상 수신자, Intent사용할 대상 requestCodeflags입니다. 동일 Context하고 동일 requestCode하며 동일한 인 텐트 ( filterEquals다른 인 텐트를 가진 인 텐트를 의미 함 )를 전달하면 동일한 PendingIntent객체 를 얻습니다 . 요점은 시스템이 PendingIntent가능한 한 적은 수의 객체를 원하기 때문에 가능한 한 기존 객체를 재사용하는 경향이 있다는 것입니다.

예를 들어, 두 개의 다른 날짜에 대해 두 개의 캘린더 알림이 있습니다. 그중 하나를 클릭하면 해당 알림 날짜에 앱이 열리기를 원합니다. 이 시나리오에서는 동일한 Context대상 Intent이 있고 전달 하는 개체는 EXTRA_DATA (개설해야하는 날짜를 지정 함)에서만 다릅니다. 객체를 requestCode얻을 때 동일한 것을 제공하면 동일한 PendingIntent객체로 끝납니다 PendingIntent. 따라서 두 번째 알림을 만들 때 이전 Intent개체를 새 EXTRA_DATA로 바꾸고 동일한 날짜를 가리키는 두 개의 알림으로 끝납니다.

PendingIntent이 시나리오에서와 같이 두 개의 다른 개체를 가지려면 개체를 requestCode가져올 때 다른 PendingIntent개체를 지정해야 합니다.


하지만 앞서 언급했듯이 알람을 취소하려면 requestCode 만 사용할 수 없습니다. 그것은 아무 의미가 없습니다. 이들을 구별하기 위해 추가 데이터를 입력해야합니다. 기억이 나지 않지만 여러 알람에 동일한 requestCode를 사용할 수도 있다고 생각합니다.
안드로이드 개발자

@androiddeveloper 방금 말한 내용이 잘못되었습니다. 시도 해봐.
Eir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.