问题:
如果目标可能取决于配置(屏幕尺寸、方向等),如何决定应该启动什么Activity
;Notification
就像人们使用Fragment
s?
细节:
让我们考虑一下NewsReader 示例,该示例演示了如何使用Fragment
s 来生成一个在多种屏幕尺寸和方向上都能正常运行的应用程序。这个应用程序的结构如下:
- 一个
HeadlinesFragment
。 - 一个
ArticleFragment
。 - “主要”活动 (
NewsReaderActivity
)。在双窗格模式下,此活动包含两个片段。在单窗格模式下,它仅包含HeadlinesFragment
. - 一个
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()
只会清除整个堆栈。
那么,如果要启动的活动取决于屏幕配置,如何决定从通知中启动什么活动?