Fragmenty i powiadomienia: kierowanie różnych działań z powiadomień; w zależności od konfiguracji ekranu

Pytanie:

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ę korzystaFragments?

Detale:

RozważmyPróbka czytnika wiadomości to pokazuje, jak używaćFragments, aby stworzyć aplikację, która gra dobrze z wieloma rozmiarami i orientacjami ekranu. Ta aplikacja ma następującą strukturę:

A 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:

Jeśli istnieje wiele aktualizacji wiadomości, kliknięcie powiadomienia powinno zawsze prowadzić użytkownika do listy nagłówków.Jeśli jest tylko jedna aktualizacja, kliknięcie powiadomienia powinno otworzyć nowy artykuł.

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?

questionAnswers(3)

yourAnswerToTheQuestion