1

根据Android活动生命周期,活动不再可见时onStop将被调用。但是,如果我很快退出第二个活动,这不会发生。当第二活动开始时第一活动不会停止

我有两个活动HomeActivityDetailActivity

步骤1.按上HomeActivity可前往[一键DetailActivity

步骤2。按DetailActivity导航到HomeActivity

当导航到DetailActivityHomeActivityonStop应该得到所谓的每个活动的生命周期,因为DetailActivity得到onStart。 但onStop没有得到调用,如果我快速按DetailActivity

活动的生命周期,如果马上回来按下..

HomeActivity: onPause 
DetailActivity: onStart 
DetailActivity: onResume 
DetailActivity: onPostResume 
DetailActivity: onPause 
HomeActivity: onResume 
HomeActivity: onPostResume 
DetailActivity: onStop 

活动的生命周期,如果后面的延迟后按(说几秒钟后上DetailActivity)

HomeActivity: onPause 
DetailActivity: onStart 
DetailActivity: onResume 
DetailActivity: onPostResume 
HomeActivity: onStop 
DetailActivity: onPause 
HomeActivity: onStart 
HomeActivity: onResume 
HomeActivity: onPostResume 
DetailActivity: onStop 

不这个模样作为新的Activity的错误已启动,以前的活动不会停止?

+2

如果你没有完成第一个活动它将保持在后台,只有onPause方法将被触发。这是正常的行为,在startActivity(...)后立即使用finish() – Chol

+0

@Chol-不,那不是。如果''DetailActivity'上的背按不快,'HomeActivity'就会变成'onStop'。只有当您立即按回 – Libin

+0

时,才会出现问题,除非以前的活动不完全不可见。 – sanemars

回答

-1

你已经描述了正常的行为。下面是https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle说一下:

当活动不再对用户可见调用,因为 另一个活动已经恢复并且覆盖这一个。这可能是因为一个新的活动正在开始,现有的 被带到这个活动的前面,或者这个活动正在被销毁。 如果此活动回到 与用户进行交互,或onDestroy()(如果此活动消失),则跟在onRestart()后面。

所以,你可能想知道,如果我的新活动是可见的,那不是说以前的活动是不可见的吗?不是真的。你的新活动可能不完全重叠旧活动(在这种情况下,旧活动的一部分仍然可见)。如果旧活动具有对用户“不可见”的元素,这可能会特别棘手,因为它们看起来与新活动中的元素相同,在技术上仍然可见(因为它们并未被新元素完全阻止)。

除了可见性外,您还可能无意中使用生命周期方法来计算导致此问题的问题。假设你的onPause()需要很长时间才能完成。另一个活动可以完全隐藏旧的,满足onStop()的条件,但是在onStop()有机会运行之前转换回来。

最后,有很多任务需要在手机上运行,​​并且有很少的处理器可以执行它们。必然有些任务比其他任务具有更高的优先级。考虑一下当新活动占据前台时必须执行的代码 - 如果手机忙于为您的活动执行代码,onStop()没有时间运行。如果该代码然后触发onResume,onStop将被完全跳过。从生命周期图中可以看到,您可以在不通过onStop()的情况下从onPause()过渡回onResume()。也许你应该考虑一下类似的情况,以便更好地理解你的特定情况(以及为什么)。

+0

我的两项活动都是全屏布局,所以不存在“可能不完全重叠旧版”的问题。除了日志以外,我不会在'onPause'上执行任何操作。这听起来像是活动进行到onStart,它需要活着几秒钟,然后再移动到onPause,如果不是以前的活动不会获得'onStop'。这似乎是我的一个bug,这就是为什么我不清楚 – Libin

+0

我不知道你为什么认为这是一个错误。好像你对操作系统的工作原理有一个简单的(和不正确的)看法。从本质上讲,您的两项活动并不是在给定电话上运行的唯一事物,它们不一定具有相同的优先级(或获得执行时间的机会)。有很多事情需要运行,并且运行它们的CPU数量要少得多。必然有些任务会比其他任务更优先。所以,你不应该期望onStop()会在活动变得隐藏的时候被调用。你所看到的是你应该期待的。 – iheanyi

+0

@libin看看生命周期图。正如你所看到的,你可以从onPause()返回onResume()而不需要通过onStop()。 Yous似乎认为你可以保证在onPause()后打onStop()。 – iheanyi

0

According to Android Docs有关的活动

用户的停止和重新启动执行你的应用程序,启动一个新的活动的诉讼。当第二个活动创建时,当前活动停止。如果用户然后按下“后退”按钮,则重新启动第一个活动。

他们应该更新它说If the user the presses the Back button but not to quickly哈哈,但我认为iheanyi是正确的,其他一些过程可能已经获得CPU时间的事实后DetailsActivity打onPostResume并按下后退按钮之前的OS可以继续与onStop进程的HomeAcitvity

相关问题