在Android KitKat中,按下电源按钮现在会调用Activity中的onStop方法,而以前只是调用onPause方法?

5
所以我刚意识到,在我的Activity中,当点击电源按钮关闭屏幕时,onStop被调用。之前只有onPause被调用。这是KitKat的改变吗?是否有任何说明(这是故意的)?这是KitKat的更改还是特定制造商实现的东西?
编辑:我将很快更新更多信息。我认为这个改变比我最初意识到的更微妙,可能是因为我持有部分唤醒锁或监听GPS更新。无论如何,我知道的是,在我的代码中,在KitKat之前,当点击电源按钮时,onStop没有被调用。也许这也与设备有关。
编辑:新信息。在以下设置下,当点击电源按钮时不会调用onStop():Android minSDKVersion=4和targetSDKVersion=8,(如果使用Android Studio,也要设置compileSdkVersion=8)。在两个设备上验证了这一点(运行KitKat和JellyBean)。因此,这个问题不是最初提到的KitKat,而是min、target SDK设置。谁能找到引用何时改变或至少展示第一个min/target sdk设置,从一个电源按钮点击改变行为来调用onStop,就会获得奖励。

有几篇关于当您不处理方向更改时可能发生这种情况的其他文章。https://dev59.com/jmkw5IYBdhLWcg3wXZX8 - Brian S
5个回答

5
生命周期的变化始于Honeycomb,或者当将目标SDK从10或更低版本更改为11或更高版本时更改应用程序。
如果Android项目声明了一个目标SDK版本小于或等于10,则在点击电源按钮时,将调用onPause,但不会调用onStop。这与许多人的想法相反。然而,如果目标SDK版本为11或更高版本,则在点击电源按钮时将调用onPause,然后调用onStop。
需要注意的是,在一些文档中,它指出当另一个活动已经恢复并覆盖当前活动时,onStop将被“调用”,但在许多其他地方,它只是简单地说明当当前活动不再可见时,将调用onStop。因此,在SDK 11之前,也许电源按钮的点击故意只调用onPause,因为没有其他活动覆盖当前活动。屏幕只是关闭了。然后在Honeycomb中,他们改变了实现以匹配其他解释(不再可见)。

0

在我看来,Kitkat与此无关。每当您的活动对用户不再可见时,都会调用onStop()。当您的屏幕关闭时(例如,当您按下电源按钮锁定屏幕时),首先会调用onPause(),然后应调用onStop()。但是,它确实取决于设备的内存情况。如果您使用的是低内存设备,该设备无法提供足够的内存来使您的活动进程保持运行状态,则可能不会调用onStop()。在这种情况下,您可能会发现只调用了onPause()。详情请参阅:http://developer.android.com/reference/android/app/Activity.html#onStop()


0

还有一个重要的要点需要注意-

如果您将设置更改为在按下电源按钮后10秒锁定手机,则在按下电源按钮10秒后将调用onStop()。


0

我已经尝试研究这个问题一段时间了。我找到了一些资源,可能有助于解释生命周期的变化。在新的KitKat更新中,似乎引入了某种低端电源管理,如这两个网站所述herehere

虽然没有明确说明这就是您经历生命周期变化的原因,但在我看来,如果Android现在自动尝试创建一个“更精简”的环境,它可能会强制应用程序在释放资源时调用onStop()。

我知道这不是一个确切的答案,但我希望这可以帮助您。我同意这并不总是这样,您肯定发现了一些有趣的东西。


-1

只有在用户仍然可以部分看到您的活动时,您的活动暂停时才会调用onPause方法,否则它将被停止。

因此,电源按钮一直都会调用onStop方法,因为您的活动实际上已经停止而不仅仅是暂停。


1
不,你错了。在之前的Android版本中,电源按钮并不总是会调用onStop()方法。 - Fraggle
onStop() 方法的定义是,当您的活动对用户不再可见或甚至部分可见时调用它。 您能告诉我 onPause() 方法被调用的 API 级别吗?@Fraggle - elmorabea
@Mahmound 我非常清楚这些定义。然而,我认为电源按钮/屏幕关闭是一个特殊情况,在过去的几年中已经有所不同处理。 - Fraggle
那么,你“认为”,你实际上不知道这个信息吗?你猜想这些年它已经被处理过了?请问有任何参考资料吗? - elmorabea
首先,请查看我的最近编辑。问题显然与minSDK/targetSDK设置有关。我已经验证,即使在KitKat上,当minSDK/targetSDK为4/8时,onStop也不会被调用。我不知道是什么值导致了这种变化,或者这种变化在哪里有记录。我不知道完整的历史,因此提出了这个问题。 - Fraggle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接