Android活动生命周期:新活动启动时状态顺序

18
如果我通过这种方式从Activity1启动Activity2:startActivity(Activity2);那么什么会先执行: onStop()(Activity1)还是onStart()(Activity2)?
它们同时工作还是轮流工作?如果是一个接一个的,哪个先执行?
所以一般来说:当第一个Activity启动第二个Activity时,活动状态的顺序是什么,如果存在此顺序的话?

仅仅在activity1中重写onStop()方法并在activity2中重写onStart()方法,加入一些日志输出,并查看哪个日志先出现。 - hovanessyan
https://dev59.com/IWoy5IYBdhLWcg3wfeIR#8516056 - Yaqub Ahmad
9个回答

57
假设Activity A通过调用StartActivity(Intent)方法开始Activity B,那么生命周期将如下所示:
  • A onCreate()
  • A onStart()
  • A onResume()
现在点击按钮开始startActivity(intent):
  • A onPause()
  • B onCreate()
  • B onStart()
  • B onResume()
  • A onStop()
如果您从活动B按返回按钮,则生命周期将如下所示:
  • B onPause()
  • A onRestart()
  • A onStart()
  • A onResume()
  • B onStop()
  • B onDestory()
现在再来看一个场景:从Activity A通过调用StartActivity(Intent)方法开始Activity B,然后在Activity B的onStart()方法中使用finish()方法。
  • A onPause()
  • B onCreate()
  • B onStart()
  • A onResume()
  • B onStop()
  • B onDestory()

如果你从B活动按返回键,生命周期将被调用......在调用B活动的onDestroy()之前,你没有提到onStop()。 - Deepak Ganachari
假设在Activity A中,您进行了Retrofit调用并等待响应,在响应中有一个启动Activity B的Intent。现在用户按下Home按钮,Activity A的onStop被调用,之后Retrofit响应到来,由于存在前往Activity B的意图,现在会发生什么?Activity B会打开吗?我发现它会打开并进入前台而不将其带回。这在我的应用程序中表现得像一个错误。发生了什么? - Aman Verma
当你按下返回按钮时,为什么Activity B会调用onDestroy,但离开Activity A并启动Activity B时Activity A不会被销毁?这是因为你可能在Android清单文件中声明了Activity A为主Activity吗? - Peter G. Williams

14

在这里输入图片描述

当我通过程序进行检查时,发现它遵循了所有的步骤,并且易于理解。


12
根据文档,在Activity2的onStart被调用之前,会先调用Activity1的onStop(或者说,如果你更喜欢这种说法,操作系统会等待Activity2的onStart执行完毕后再调用Activity1的onStop)。
根据http://developer.android.com/guide/topics/fundamentals/activities.html的说明:
生命周期回调的顺序是明确定义的,特别是当两个活动在同一个进程中,其中一个正在启动另一个时。以下是 Activity A 启动 Activity B 时发生的操作顺序:
- Activity A 的 onPause() 方法会被执行。 - Activity B 的 onCreate()、onStart() 和 onResume() 方法按顺序被执行。(现在,Activity B 具有用户焦点。) - 然后,如果 Activity A 不再可见,它的 onStop() 方法就会被执行。

Android开发者网站已更新,协调活动部分位于https://developer.android.com/guide/components/activities/activity-lifecycle.html。 - Sungam
假设在Activity A中,您进行了Retrofit调用并等待响应,在响应中有一个启动Activity B的Intent。现在用户按下Home按钮,Activity A的onStop被调用,之后Retrofit响应到来,由于存在前往Activity B的意图,现在会发生什么?Activity B会打开吗?我发现它会打开并进入前台而不将其带回。这在我的应用程序中表现得像一个错误。发生了什么? - Aman Verma

11
假设Activity A通过调用StartActivity(Intent)方法启动Activity B,则生命周期调用如下:
- A onCreate(),A onStart(),A onResume() - 现在按下“startActivity(intent)”的按钮 - A onPause(),B onCreate(),B onStart(),B onResume(),A onStop()
如果您从Activity B按返回按钮,则生命周期呼叫将是....
- B onPause(),A onRestart(),A onStart(),A onResume(),B onStop(),B onDestroy()
现在,还有一种情况:“从Activity A通过单击按钮调用StartActivity(Intent)启动Activity B,并在Activity B的onStart()方法中使用finish()方法”
- A onPause(),B onCreate(),B onStart(),A onResume(),B onStop(),B onDestroy()

3

以下是当Activity A启动Activity B时发生的操作顺序:

执行Activity A的onPause()方法。

按序列执行Activity B的onCreate()、onStart()和onResume()方法。(现在,Activity B具有用户焦点。)

然后,如果Activity A不再在屏幕上可见,则执行其onStop()方法。

1


以下是有关编程的相关内容的翻译。这是参考链接:https://developer.android.com/guide/components/activities/activity-lifecycle#coordinating-activities图片+1 - h8pathak

2
关键是理解活动的启动方式。当您在startActivity()方法中发布Intent时,您只是请求系统启动此活动。接下来,系统尝试启动Activity2并向Activity1发送消息。顺序未确定,并且在不同情况下可能不同。
对于在同一进程(应用程序)中同时运行两个活动的情况,我的答案似乎是错误的,如Daniil Popov所指出:https://developer.android.com/guide/components/activities/activity-lifecycle.html (协调活动部分)。

3
顺序已确定- http://developer.android.com/guide/components/activities.html#CoordinatingActivities - Daniil Popov
2
Android开发者网站已更新,协调活动部分位于https://developer.android.com/guide/components/activities/activity-lifecycle.html。 - Sungam
假设在Activity A中,您进行了Retrofit调用并等待响应,在响应中,您有一个启动Activity B的Intent。现在用户按下主页按钮,Activity A的onStop被调用,之后Retrofit响应到来,由于有一个Intent跳转到Activity B,现在会发生什么?Activity B是否会打开?我发现它会打开并前台显示而不是后台运行。这在我的应用程序中表现得像一个错误。到底发生了什么? - Aman Verma

1
每当我们从第一个活动导航到第二个活动时,onPause()方法会被调用,然后是onStop()方法,接着第二个活动的onCreate()方法被调用,然后是onStart()方法,最后是onResume()方法。
同样地,通过按下返回键导航回第一个活动时,第二个活动的onPause()方法会被调用,然后是onStop()方法,接着第一个活动的onRestart()方法被调用,然后是onStart()方法,最后是onResume()方法。

我刚刚在我的应用程序中添加了一些日志记录代码,我看到了一个不同的画面:1)Activity1 onPause() 2)Activity2 onStart 3)activity2 onResume() 4)Activity1 onStop()。 - Anton Cherkashyn

0

生命周期回调的顺序是明确定义的,特别是当两个活动在同一个进程中且一个正在启动另一个时。以下是 Activity A 启动 Activity B 时发生的操作顺序:

Activity A 的 onPause() 方法执行。Activity B 的 onCreate()、onStart() 和 onResume() 方法按顺序执行。(Activity B 现在具有用户焦点。)然后,如果 Activity A 不再在屏幕上可见,则其 onStop() 方法执行。


0
使用Log将日志发布到Logcat。
Log.v("STATE", "Pause...and so on");

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