Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 什么是;能见度“;请参阅活动生命周期中的?暂停还是暂停?_Android_Android Activity_Activity Lifecycle - Fatal编程技术网

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通知,并发现了一些额外的奇怪之处:

  • 按下Home(主页)按钮将始终调用onStop()。但是启动应用程序不会调用
    onRestart()
    。相反,它调用
    onCreate()
    。这对我来说似乎很奇怪,但好吧
  • 在主活动顶部启动“USB大容量存储”活动时,将调用
    onStop()
    。当退出usb存储活动并返回主活动时,将调用
    onRestart()
    ,而不是
    onCreate()
  • 当设备进入睡眠模式并被唤醒时,该活动只经过
    onPause()
    onResume()
    循环
  • 最后一点是意料之中的(尽管我无法让它符合生命周期图)。但是1怎么了。和2

    在第一点中,我希望在再次启动活动时调用
    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()
    (也没有)