Tło:
Używam PendingIntent do alarmów za pośrednictwem AlarmManager.
Problem:
Na początku pomyślałem, że aby anulować poprzednie, muszę podać dokładny requestCode, którego użyłem wcześniej do uruchomienia alarmu.
Ale potem dowiedziałem się, że się myliłem, ponieważ API anulowania mówi:
Usuń wszystkie alarmy z dopasowaną intencją. Każdy alarm dowolnego typu, którego intencja pasuje do tego (zgodnie z definicją filterEquals (Intent)), zostanie anulowany.
patrząc na „ filterEquals ”, dokumentacja mówi:
Określ, czy dwie intencje są takie same, na potrzeby rozwiązania intencji (filtrowania). Oznacza to, że ich działanie, dane, typ, klasa i kategorie są takie same. Nie porównuje to żadnych dodatkowych danych zawartych w intencjach.
więc nie rozumiem, do czego służy „requestCode” ...
Pytanie:
Do czego służy „requestCode”?
Co się stanie, jeśli utworzę wiele alarmów z tym samym „requestCode”? czy mają pierwszeństwo?
źródło
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.
Odpowiedzi:
requestCode
służy do późniejszego pobrania tej samej oczekującej instancji intencji (do anulowania itp.).źródło
Chcę tylko dodać do odpowiedzi @Minhaj Arfin
1- requestCode służy do późniejszego uzyskania tego samego oczekującego zamiaru (do anulowania itp.)
2 - Tak, zostaną one zastąpione, o ile określisz tego samego odbiorcę w swoim zamiarze, który określisz w swoim PendingIntent
przykład:
Z powyższego przykładu nie będą się nadpisywać, ponieważ odbiornik jest inny (AlarmReceiverFirst i AlarmReceiverSecond)
Z powyższego przykładu będą się nadpisywać, ponieważ odbiornik jest taki sam (AlarmReceiverSecond)
źródło
AlarmReceiverSecond.class
w zamiarze, a następnie używaszPendingIntent.getService()
. To nie zadziała, ponieważAlarmReceiverSecond.class
jest toBroadcastReceiver
, a nieService
w moim przypadku chcę otworzyć tę samą czynność z dwoma różnymi intencjami, więc jeśli w zasobniku są dwa lub więcej FCMS, jeden z nich otworzy tylko inne nie, więc zmieniłem kody żądań oczekujących zamiarów, a następnie zadziałało.
źródło
Jedną z ważnych rzeczy,
requestCode
które będą poważnym problemem w Twojej aplikacji, są widżety. widżety nie będą działać po ponownym uruchomieniu telefonu, jeślirequestCode
są takie same. Oznacza to, że elementpendingIndent
ustawiony wremoteViews
widgecie musi mieć ustawiony unikalny kod żądania, zwykle widgetId towarzyszący liczbie.źródło
W rzeczywistości dokumentacja jasno określa, do czego służy kod żądania:
Ponieważ wydaje się, że nadal nie jest to takie jasne, spróbuję wyjaśnić:
Kiedy chcesz użyć
PendingIntent
obiektu, nie tworzysz go po prostu. Przeciwnie, można uzyskać jedną z systemu przy użyciuPendingIntent
metody statyczne (getActivity
,getBroadcast
,getService
etc). System przechowuje kilka instancji PendingIntent i daje Ci jedną. To, który z nich daje, zależy od parametrów wejściowych przekazanych do tych metod pobierających. Te parametry wejściowe to:Context
tj. Docelowy odbiorca zamiaru,Intent
użycierequestCode
iflags
. Kiedy przekazujesz ten samContext
, ten samrequestCode
i ten sam zamiar (co oznacza zamiarfilterEquals
z inną intencją), otrzymujesz ten samPendingIntent
obiekt. Chodzi o to, że system chce mieć jak najmniejPendingIntent
obiektów, więc ma tendencję do ponownego wykorzystywania istniejących, w jak największym stopniu.Na przykład masz dwa powiadomienia kalendarza dla dwóch różnych dat. Po kliknięciu jednego z nich chcesz, aby Twoja aplikacja otworzyła się zgodnie z datą tego powiadomienia. W tym scenariuszu masz ten sam
Context
cel, aIntent
obiekt, który przekazujesz różni się tylko DANE_DODATKOWE (które określają datę, która powinna być otwarta). Jeśli podasz to samorequestCode
przy zdobywaniuPendingIntent
przedmiotu, otrzymasz ten samPendingIntent
przedmiot. Tak więc, tworząc drugie powiadomienie,Intent
zastąpisz stary obiekt nowym EXTRA_DATA i otrzymasz dwa powiadomienia wskazujące tę samą datę.Jeśli chcesz mieć dwa różne
PendingIntent
obiekty, tak jak powinieneś w tym scenariuszu,requestCode
podczas uzyskiwaniaPendingIntent
obiektu należy określić inny .źródło