Android 什么是;能见度“;请参阅活动生命周期中的?暂停还是暂停?
活动生命周期让我头疼。 上的文档在描述可见性的概念时非常模糊,我无法确定何时调用Android 什么是;能见度“;请参阅活动生命周期中的?暂停还是暂停?,android,android-activity,activity-lifecycle,Android,Android Activity,Activity Lifecycle,活动生命周期让我头疼。 上的文档在描述可见性的概念时非常模糊,我无法确定何时调用onStop(),而不是onPause() 比较文档中的以下两个语句: (取自生命周期图的右下方) 可以多次调用onStart()和onStop()方法,如下所示: 活动对用户可见和隐藏 vs (下面蓝色表格中的“killable”列) onPause()在系统即将开始恢复以前的活动时调用 我从第一句话中了解到,当A处于“隐藏”状态时,在活动A上调用onStop()。我猜“隐藏”指的是另一个活动B已经恢复,并且完全覆
onStop()
,而不是onPause()
比较文档中的以下两个语句:
(取自生命周期图的右下方)
可以多次调用onStart()
和onStop()
方法,如下所示:
活动对用户可见和隐藏
vs
(下面蓝色表格中的“killable”列)
onPause()
在系统即将开始恢复以前的活动时调用
我从第一句话中了解到,当A
处于“隐藏”状态时,在活动A
上调用onStop()
。我猜“隐藏”指的是另一个活动B
已经恢复,并且完全覆盖活动A
。
但第二个引号指出,当另一个活动即将开始恢复时,将调用onPause()
。这难道不能完全隐藏活动A吗?这两种情况似乎都意味着活动A
被“隐藏”,不是吗?根据我可能的错误解释,onPause()
和onStop()
在相同的情况下被调用
文档在隐藏(onStop()
被调用)和部分可见性(onPause()
被调用)之间似乎也有所不同。但什么时候活动仍然部分可见?它们是字面意思吗?或者,当一个活动启动了一个覆盖整个屏幕的新活动(该活动调用startActivityForResult并启动一个日期选择器活动)时,它仍然可以被视为“部分可见”吗?活动肯定不会被激活?它应该随时收到结果
所以我想知道我没有得到什么。
我知道保证会调用onPause。当活动A
失去焦点时(设备进入睡眠模式、屏幕锁定等),另一个活动B
占据前台(其中活动B
可能由活动A
启动,也可能未启动)。
但是在活动A
上调用的onStop()
是在哪一点上
在活动堆栈上,在活动A的顶部堆积了多少个活动,这是否重要?“可见性”有两种不同的定义吗
关于文字墙,我很抱歉,但我真的很沮丧:S
因此,问题在于:究竟在什么情况下,活动被视为“隐藏”,从而调用onStop()
编辑:
我在每个onX方法中插入了Toast通知,并发现了一些额外的奇怪之处:
onRestart()
。相反,它调用onCreate()
。这对我来说似乎很奇怪,但好吧onStop()
。当退出usb存储活动并返回主活动时,将调用onRestart()
,而不是onCreate()
onPause()
和onResume()
循环onRestart()
。为什么它取消分配活动并调用onCreate()
请看第2点:
根据文档:当“另一个活动出现在活动前面”时,应调用
onPaused()
。这不是USB存储活动出现时发生的情况吗?它没有调用onPause()
,而是经历了onStop()
-OnRestart()
循环!显然,文档没有考虑“另一个活动出现在活动之前”的情况。那么到底发生了什么呢?好的,我想我现在明白了
一,
第一点的关键是这个链接:
这是一只虫子。链接中的一些代码完全解决了创建新根活动实例的问题,而不是仅仅重新启动上一个活动(在按下home按钮之前)
我将代码放在onCreate方法的顶部,就在super.onCreate调用的下面:
if (!isTaskRoot()) {
final Intent intent = getIntent();
final String intentAction = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) &&
intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
finish(); return;
}
}
注意,我在finish之后添加了return语句,以便在检测到bug的情况下,onCreate方法的其余部分不会运行
二,三
第二点和第三点的关键是这两个环节:
事实证明,“可见性”确实是字面意思!因此,当文档中说“另一个活动出现在活动前面”时,碰撞活动后面的活动仍然部分可见。这意味着Android Activity manager必须检查颠簸的活动是否为全屏活动:如果是,则在上一个活动中调用onStop()
。如果不是,则对上一个活动调用onPaused()
这简单地解释了为什么USB存储管理器导致调用onStop()
这也意味着,当设备进入睡眠模式时,活动管理器将其视为非全屏活动,即使从技术上讲,主要活动完全隐藏在其后面
(参见关于如何进行非全屏活动的第二个链接)
有趣的是,下拉窗口(带有通知)没有调用onPause()
(也没有)