2

一项任务:我应该跟踪整个 Android 应用程序的可见性,并在它进入后台或前台时生成事件。任务的第一部分已完成:我有特殊的全局计数器,我在 Activity onStart() 中递增并在 Activity onStop()中递减,当此计数器降至零时,我的应用程序已进入后台。

任务的第二部分是诡计多端的。我知道onResume()的奇怪行为以及使用onWindowFocusChanged(boolean)的建议。我查看了onWindowFocusChanged(boolean)的文档并注意到这样的事情:

但是,作为一般规则,恢复的活动将具有窗口焦点...除非它显示了其他对话框或获取输入焦点的弹出窗口,在这种情况下,当其他窗口具有焦点时,活动本身将没有焦点。同样,系统可能会显示系统级窗口(例如状态栏通知面板或系统警报),这些窗口将暂时获取窗口输入焦点,而不会暂停前台活动。

有什么方法可以检查:谁的窗口显示在我的应用程序恢复的活动上?是我的对话还是键盘保护?有什么方法可以捕捉事件:除了我的恢复活动的窗口之外的所有窗口都被删除了吗?

4

1 回答 1

0

您基于计数器的方法是完全错误的。原因之一: onStop() 不能保证执行。

我假设您对“背景”和“前景”的概念应该与 Android 相同。但是,当我读到您到目前为止所做的事情时,您似乎对“背景”和“前景”的含义与 Android 有不同的想法。

从那里:

  • 如果您知道背景和前景的含义与 Android 不同,那么您不是在帮自己一个忙,并且可能会走错路,因此请重新考虑调整前景和背景的含义。
  • 一旦您对背景和前景有了与 Android 相同的想法,问题是,为什么您必须在 Android 已经这样做的情况下生成事件。如果您必须将事件发送到服务等,那么通过侦听Activity 生命周期事件并为您的服务触发相应的事件将很简单。

关于onWindowFocusChanged:是的,当然通知面板可以暂时隐藏你的App;你用过安卓设备吗?这里最大的问题是你是否会在后台考虑你的应用程序,因为如果正在显示通知面板,Android 会认为你的应用程序在后台。

更新:我刚刚重新阅读了您的 Q 标题。不幸的是,您并没有说明您真正想要/需要做什么,因为可见性可能意味着很多事情。例如,如果一个半透明的通知面板被放置在它上面,你是否认为你的应用是可见的?但底线保持不变:如果您将您想要的内容与 Android 提供的内容保持一致,那将是最简单的。;)

更新 2:如果您真的需要知道您的 Activity 是否已通过您自己的活动弹出窗口或您自己移动到后台,这里的答案应该为您提供所需的信息。

于 2013-02-12T08:13:32.243 回答