Fragmenty i powiadomienia: kierowanie różnych działań z powiadomień; w zależności od konfiguracji ekranu
Jak zdecydować coActivity
a Notification
powinien zostać uruchomiony, jeśli cel może zależeć od konfiguracji (rozmiar ekranu, orientacja itp.); jak to często bywa, gdy się korzystaFragment
s?
RozważmyPróbka czytnika wiadomości to pokazuje, jak używaćFragment
s, aby stworzyć aplikację, która gra dobrze z wieloma rozmiarami i orientacjami ekranu. Ta aplikacja ma następującą strukturę:
HeadlinesFragment
.NaArticleFragment
.„Główna” działalność (NewsReaderActivity
). W trybie dwupanelowym ta aktywność zawiera oba fragmenty. W trybie pojedynczego okienka zawiera tylkoHeadlinesFragment
.NaArticleActivity
. Ta czynność jest używana tylko w trybie pojedynczego okienka; i zawieraArticleFragment
.Załóżmy teraz, że mam ulepszyć tę aplikację, aby dodać tłoService
który nasłuchuje aktualizacji wiadomości i powiadamia użytkownika za pomocą powiadomień na pasku stanu, gdy pojawiają się nowe wiadomości. Lista rozsądnych wymagań może brzmieć następująco:
Należy zauważyć, że te wymagania przekładają się na różne działania docelowe w zależności od bieżącej konfiguracji. W szczególności,
Wymaganie (1) w każdym trybie =NewsReaderActivity
.Wymagania (2) w trybie podwójnego panelu =NewsReaderActivity
.Wymaganie (2) w trybie pojedynczego panelu =ArticleActivity
.Jaki byłby elegancki sposób na osiągnięcie (2) i (3) powyżej? Myślę, że można bezpiecznie wykluczyć możliwośćService
sondowanie bieżącej konfiguracji, aby zdecydować, jaką aktywność wybrać za pomocąPendingIntent
.
Jedno rozwiązanie, o którym myślałem, to przeskoczyć (2) i zawsze robić (3) - tzn. Zawsze uruchamiaćArticleActivity
jeśli jest tylko jedna aktualizacja wiadomości. Ten fragment z ArticleActivity wyglądał obiecująco:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
//...
// If we are in two-pane layout mode, this activity is no longer necessary
if (getResources().getBoolean(R.bool.has_two_panes)) {
finish();
return;
}
//...
//...
}
Ten kod zapewnia, że jeśli oglądaszArticleActivity
, ale przełącza się na konfigurację, w której nie jest już wymagana (na przykład z portretu na krajobraz); następnie czynność się zamyka.
Jednak to nie zadziała w naszym przypadku, ponieważ intencja będzie miałaFLAG_ACTIVITY_NEW_TASK
zestaw flag; stworzylibyśmy nowe zadanie i nie ma „poprzedniej” aktywności na stosie. Więc dzwonifinish()
po prostu wyczyści cały stos.
Jak więc zdecydować, która aktywność ma zostać uruchomiona z powiadomienia, jeśli działanie do uruchomienia zależy od konfiguracji ekranu?