배경:
AlarmManager를 통해 알람에 PendingIntent를 사용하고 있습니다.
문제 :
처음에는 이전의 것을 취소하려면 알람을 시작하기 전에 사용했던 정확한 requestCode를 제공해야한다고 생각했습니다.
그러나 취소 API가 말한 것처럼 내가 틀렸다는 것을 알게되었습니다 .
인 텐트가 일치하는 모든 경보를 제거합니다. 의도와 일치하는 모든 유형의 경보 (filterEquals (Intent)로 정의 됨)는 취소됩니다.
” filterEquals “를 보면 문서는 다음과 같이 말합니다.
인 텐트 해결 (필터링)을 위해 두 인 텐트가 동일한 지 확인합니다. 즉, 작업, 데이터, 유형, 클래스 및 범주가 동일한 경우입니다. 이는 인 텐트에 포함 된 추가 데이터를 비교하지 않습니다.
그래서 나는 “requestCode”가 무엇인지 이해하지 못한다.
질문:
“requestCode”는 무엇에 사용됩니까?
동일한 “requestCode”로 여러 알람을 생성하면 어떻게됩니까? 그들은 서로를 무시합니까?
답변
requestCode
나중에 동일한 보류중인 인 텐트 인스턴스를 검색하는 데 사용됩니다 (취소 등).- 네, 내 생각 엔 알람이 서로 무시할 것입니다. 요청 코드를 고유하게 유지합니다.
답변
@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)
답변
제 경우에는 두 개의 다른 의도로 동일한 활동을 열고 싶으므로 두 개 이상의 FCMS가 트레이에 있으면 그중 하나는 다른 하나는 열지 않을 것이므로 보류중인 의도의 요청 코드를 변경 한 다음 작동했습니다.
PendingIntent pendingIntent =
PendingIntent.getActivity(this, **Some unique id for all GCMS** /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
답변
requestCode
앱에 심각한 문제를 일으킬 수있는 한 가지 중요한 점은 위젯을 사용할 때입니다. requestCode
동일한 위젯은 전화 재부팅 후 작동하지 않습니다 . 즉, 위젯 pendingIndent
에 설정하는 것은 remoteViews
고유 한 requestCode, 일반적으로 숫자와 함께 제공되는 widgetId로 설정되어야 함을 의미합니다 .
답변
실제로 문서 에는 요청 코드가 사용되는 용도가 명확하게 나와 있습니다.
동시에 활성화 된 여러 개의 고유 한 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
사용할 대상 requestCode
및 flags
입니다. 동일 Context
하고 동일 requestCode
하며 동일한 인 텐트 ( filterEquals
다른 인 텐트를 가진 인 텐트를 의미 함 )를 전달하면 동일한 PendingIntent
객체 를 얻습니다 . 요점은 시스템이 PendingIntent
가능한 한 적은 수의 객체를 원하기 때문에 가능한 한 기존 객체를 재사용하는 경향이 있다는 것입니다.
예를 들어, 두 개의 다른 날짜에 대해 두 개의 캘린더 알림이 있습니다. 그중 하나를 클릭하면 해당 알림 날짜에 앱이 열리기를 원합니다. 이 시나리오에서는 동일한 Context
대상 Intent
이 있고 전달 하는 개체는 EXTRA_DATA (개설해야하는 날짜를 지정 함)에서만 다릅니다. 객체를 requestCode
얻을 때 동일한 것을 제공하면 동일한 PendingIntent
객체로 끝납니다 PendingIntent
. 따라서 두 번째 알림을 만들 때 이전 Intent
개체를 새 EXTRA_DATA로 바꾸고 동일한 날짜를 가리키는 두 개의 알림으로 끝납니다.
PendingIntent
이 시나리오에서와 같이 두 개의 다른 개체를 가지려면 개체를 requestCode
가져올 때 다른 PendingIntent
개체를 지정해야 합니다.