Вопрос:
Как решить, что должен запускать Activity
a Notification
, если цель может зависеть от конфигурации (размер экрана, ориентация и т.д.); как это часто бывает при использовании Fragment
s?
Детали:
Рассмотрим образец NewsReader, в котором показано, как использовать Fragment
для создания приложения, которое хорошо воспроизводится с несколькими размерами экрана и ориентациями. Это приложение структурировано следующим образом:
- A
HeadlinesFragment
. - An
ArticleFragment
. - "Основная" деятельность (
NewsReaderActivity
). В режиме двойной панели это действие содержит оба фрагмента. В однополевом режиме он содержит толькоHeadlinesFragment
. - An
ArticleActivity
. Эта активность используется только в режиме одиночной панели; и он содержитArticleFragment
.
Теперь предположим, что я должен улучшить это приложение, чтобы добавить фон Service
, который прослушивает новости и уведомляет пользователя через уведомления о статусной строке всякий раз, когда появляются новые новости. Разумный список требований может выглядеть следующим образом:
- Если есть несколько обновлений новостей, нажатие на уведомление всегда должно включать пользователя в список заголовков.
- Если есть только одно обновление, нажатие на уведомление должно открыть новую новостную статью.
Обратите внимание, что эти требования переходят на разные целевые действия в зависимости от текущей конфигурации. В частности,
- Требование (1) в любом режиме =
NewsReaderActivity
. - Требование (2) в режиме двойной панели =
NewsReaderActivity
. - Требование (2) в режиме с одной панелью =
ArticleActivity
.
Каким будет элегантный способ достижения (2) и (3) выше? Я думаю, можно с уверенностью исключить возможность опроса Service
для текущей конфигурации, чтобы определить, какую активность нужно настроить с помощью PendingIntent
.
Одним из решений, о котором я думал, было пропустить (2) и всегда делать (3) - т.е. всегда запускать ArticleActivity
, если есть только одно обновление новостей. Этот фрагмент статьи ArticleActivity выглядел многообещающим:
@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;
}
//...
//...
}
Этот код гарантирует, что если вы просматриваете ArticleActivity
, но переключитесь на конфигурацию, где она больше не требуется (например, от портрета к пейзажу); то активность просто закрывается.
Однако это не будет работать в нашем случае, поскольку у намерения будет установлен флаг FLAG_ACTIVITY_NEW_TASK
; мы бы создали новую задачу, и в стеке не было "предыдущего" действия. Таким образом, вызов finish()
просто очистит весь стек.
Итак, как решить, какую активность запускать из уведомления, если запуск активности зависит от конфигурации экрана?