Android Activity 的生命周期是什么?为什么在初始化期间调用了这么多类似的发声方法(onCreate()
, onStart()
, ),而在最后调用了这么多其他方法( , , )?onResume()
onPause()
onStop()
onDestroy()
什么时候调用这些方法,应该如何正确使用它们?
在Activity Lifecycle中查看它(在 Android Developers)。
在第一次创建活动时调用。这是您应该进行所有常规静态设置的地方:创建视图、将数据绑定到列表等。此方法还为您提供了一个包含活动先前冻结状态的 Bundle(如果有的话)。始终跟在 onStart() 之后。
在您的活动停止后、再次开始之前调用。始终跟随 onStart()
当活动对用户可见时调用。如果活动进入前台,则后跟 onResume()。
当 Activity 开始与用户交互时调用。此时,您的活动位于活动堆栈的顶部,用户输入将转到它。始终跟随 onPause()。
暂停():
当活动进入后台但尚未(尚未)被杀死时,作为活动生命周期的一部分调用。onResume() 的对应项。当活动 B 在活动 A 之前启动时,将在 A 上调用此回调。在 A 的 onPause() 返回之前不会创建 B,因此请确保此处不要做任何冗长的事情。
当您不再对用户可见时调用。接下来您将收到 onRestart()、onDestroy() 或什么也没有,这取决于以后的用户活动。请注意,在调用 onPause() 方法后系统没有足够内存来保持活动进程运行的低内存情况下,可能永远不会调用此方法。
在您的活动被销毁之前您收到的最后一个电话。这可能是因为 Activity 正在完成(有人在其上调用了 finish(),或者因为系统正在临时销毁该 Activity 实例以节省空间。您可以使用 isFinishing() 方法区分>这两种情况。
当 Activity第一次加载时,事件被调用如下:
onCreate()
onStart()
onResume()
当您单击电话按钮时,活动将进入后台并调用以下事件:
onPause()
onStop()
退出电话拨号器,将调用以下事件:
onRestart()
onStart()
onResume()
当您单击后退按钮或尝试完成()活动时,事件被调用如下:
onPause()
onStop()
onDestroy()
Android 操作系统使用优先级队列来协助管理设备上运行的活动。根据特定 Android 活动所处的状态,它会在操作系统内被分配一定的优先级。此优先系统可帮助 Android 识别不再使用的活动,从而允许操作系统回收内存和资源。下图说明了活动在其生命周期中可以经历的状态:
这些状态可以分为三个主要组,如下所示:
活动或正在运行- 如果活动位于前台(也称为活动堆栈的顶部),则活动被视为活动或正在运行。这被认为是 Android Activity 堆栈中优先级最高的 Activity,因此只会在极端情况下被操作系统杀死,例如,如果 Activity 尝试使用比设备上可用的内存更多的内存,因为这可能会导致 UI变得反应迟钝。
暂停- 当设备进入睡眠状态,或活动仍然可见但被新的、非全尺寸或透明活动部分隐藏时,该活动被视为已暂停。暂停的活动仍然存在,也就是说,它们维护所有状态和成员信息,并保持连接到窗口管理器。这被认为是 Android Activity 堆栈中优先级第二高的 Activity,因此,只有在终止此 Activity 将满足保持 Active/Running Activity 稳定和响应所需的资源要求时,才会被操作系统终止。
已停止- 被其他活动完全遮挡的活动被视为已停止或在后台。已停止的活动仍然尝试尽可能长时间地保留其状态和成员信息,但已停止的活动被认为是三种状态中最低的优先级,因此操作系统将首先终止该状态的活动以满足资源需求优先级更高的活动。
*了解生命周期的示例活动**
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
String tag = "LifeCycleEvents";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(tag, "In the onCreate() event");
}
public void onStart()
{
super.onStart();
Log.d(tag, "In the onStart() event");
}
public void onRestart()
{
super.onRestart();
Log.d(tag, "In the onRestart() event");
}
public void onResume()
{
super.onResume();
Log.d(tag, "In the onResume() event");
}
public void onPause()
{
super.onPause();
Log.d(tag, "In the onPause() event");
}
public void onStop()
{
super.onStop();
Log.d(tag, "In the onStop() event");
}
public void onDestroy()
{
super.onDestroy();
Log.d(tag, "In the onDestroy() event");
}
}
Activity有六个状态
Activity生命周期有七种方法
onCreate()
onStart()
onResume()
onPause()
onStop()
onRestart()
onDestroy()
情况
打开应用程序时
onCreate() --> onStart() --> onResume()
当按下返回按钮并退出应用程序时
onPaused() -- > onStop() --> onDestory()
按下主页按钮时
onPaused() --> onStop()
再次从最近的任务列表中打开应用程序或单击图标时按下主页按钮后
onRestart() --> onStart() --> onResume()
当从通知栏打开另一个应用程序或打开设置时
onPaused() --> onStop()
从另一个应用程序或设置按下后退按钮然后使用可以看到我们的应用程序
onRestart() --> onStart() --> onResume()
当屏幕上打开任何对话框时
onPause()
从对话框中关闭对话框或返回按钮后
onResume()
任何电话都在响铃并且用户在应用程序中
onPause() --> onResume()
当用户按下电话的接听按钮时
onPause()
通话结束后
onResume()
手机屏幕关闭时
onPaused() --> onStop()
当屏幕重新打开时
onRestart() --> onStart() --> onResume()
整个混乱是因为谷歌选择了非直观的名称而不是如下内容:
onCreateAndPrepareToDisplay() [instead of onCreate() ]
onPrepareToDisplay() [instead of onRestart() ]
onVisible() [instead of onStart() ]
onBeginInteraction() [instead of onResume() ]
onPauseInteraction() [instead of onPause() ]
onInvisible() [instead of onStop]
onDestroy() [no change]
活动图可以解释为:
有七种方法可以管理 Android 应用程序的生命周期:
让我们举一个简单的场景,知道这些方法的调用顺序将有助于我们清楚地说明使用它们的原因。
onCreate()
- - - > - - - >onStart()
onResume()
onPause()
- - - > onStop()
onRestart()
- - - > - - - >onStart()
onResume()
onStop()
- - - > onDestroy()
起始状态涉及:
创建一个新的 Linux 进程,为新的 UI 对象分配新的内存,并设置整个屏幕。所以大部分工作都在这里。
运行状态涉及:
它是当前在屏幕上的活动(状态)。仅此状态就可以处理诸如在屏幕上键入以及触摸和单击按钮之类的事情。
暂停状态包括:
当活动不在前台而是在后台时,则称该活动处于暂停状态。
停止状态涉及:
一个停止的活动只能通过重新启动它来购买到前台,并且它也可以在任何时间点被销毁。
活动管理器以这样一种方式处理所有这些状态,即使在将新活动添加到现有活动的情况下,用户体验和性能也始终处于最佳状态
我喜欢这个问题和它的答案,但到目前为止,还没有涵盖不太常用的回调,如onPostCreate()或onPostResume()。Steve Pomeroy 在https://github.com/xxv/android-lifecycle尝试了一个图表,包括这些以及它们与 Android 的Fragment生命周期的关系。我修改了史蒂夫的大图,只包括活动部分,并将其格式化为字母大小的一页打印输出。我已在https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf将其作为文本 PDF 发布,下面是它的图像:
从 Android 开发者页面,
暂停():
当系统即将开始恢复以前的活动时调用。这通常用于提交对持久数据的未保存更改、停止动画和其他可能消耗 CPU 的事情等。此方法的实现必须非常快速,因为在此方法返回之前不会恢复下一个活动。如果活动返回到前面,则跟随 onResume(),如果对用户不可见,则跟随 onStop()。
停止():
当活动不再对用户可见时调用,因为另一个活动已恢复并正在覆盖该活动。这可能是因为正在启动一项新活动,正在将现有活动带到这个活动之前,或者这个活动正在被破坏。如果此活动返回与用户交互,则为 onRestart(),如果此活动即将消失,则为 onDestroy()。
现在假设有三个活动,你从 A 到 B,那么现在从 B 到 C 将调用 A 的 onPause,然后将调用 B 的 onPause 和 A 的 onStop。
暂停的 Activity 会获得 Resume 并且 Stopped 会重新启动。
当您调用时this.finish()
,将调用 onPause-onStop-onDestroy。要记住的主要事情是:当 Android 需要内存用于其他操作时,暂停的活动会被停止,并且停止的活动会被销毁。
我希望它足够清楚。
Android Activity 的生命周期是什么?
在 android sdk 框架中,每个 android Activity(Window) 都有生命周期方法。这意味着,当用户进入应用程序时,他可以看到在 onCreate() 生命周期方法中创建的 Activity。仅在 onCreate() 方法中附加在窗口中的布局。
Activity(Window) 具有以下生命周期状态:
Create - Activity is created.
Start - Current activity gets started.
Resume - Current activity has been in resumed state.
Restart - Current activity has been in restarted.
Pause - Current activity has been in Paused state.
Stop - Current activity has been in stopped state.
destroy - Current activity has been in destroyed state.
为什么在初始化期间调用了这么多类似的探测方法(onCreate()、onStart()、onResume()),而在最后调用了这么多其他方法(onPause()、onStop()、onDestroy())?
First time user enter into an application:
打开应用程序时,我们可以看到一个 Window(Activity)。onCreate (created) -> onStart(started) -> onResume(resume state) 将被调用。
Close the application from background:
从后台关闭应用程序时,必须销毁活动以释放一些内存。因此,将调用 onPause -> onStop -> onDestroy 方法。
什么时候调用这些方法,应该如何正确使用它们?
启动应用程序:
当用户第一次进入活动或应用程序时:
onCreate()
onStart()
onResume()
当您从 android studio 运行应用程序时:
onCreate()
onStart()
onResume()
活动过渡:
从第一个活动 -> 第二个活动移动时:
first_activity : onPause()
second_activity : onCreate()
second_activity : onStart()
second_activity : onResume()
first_activity : onStop()
从第二个活动 -> 第一个活动移动时:
second_activity : onPause()
first_activity : onRestart()
first_activity : onStart()
first_activity : onResume()
second_activity : onStop()
second_activity : onDestroy()
概览按钮:
当用户单击概览按钮(硬件第三个按钮 - 最近列表)时:
onPause()
onStop()
在用户关闭概览按钮(或)后,用户从最近列表中转到其他一些应用程序并返回到应用程序:
onRestart()
onStart()
onResume()
主页按钮:
当用户点击主页按钮时:
onPause()
onStop()
用户搜索主屏幕并单击应用程序图标以返回活动:
onRestart()
onStart()
onResume()
用户接到电话:
当用户在活动中时,电话来了:
onPause()
onStop()
如果用户没有接听电话,它会自动断开连接并返回活动(未接电话):
onRestart()
onStart()
onResume()
如果用户未接听电话:
N/A - 不会调用任何生命周期。
关机按钮:
当用户关闭按钮时:
onPause()
onStop()
解锁设备时:
onRestart()
onStart()
onResume()
弹出对话框:
当弹出对话框出现时 - 不会调用生命周期
重启设备或关闭:
当用户重启或关闭设备时:
onPause()
onStop()
当用户从主屏幕单击应用程序图标时:
onCreate()
onStart()
onResume()
在高度评价的答案之上添加更多信息(添加了 KILLABLE 的附加部分和下一组方法,这些方法将在生命周期中调用):
注意上表中的“ Killable ”列——对于那些被标记为可杀死的方法,在该方法返回后,托管该活动的进程可能随时被系统杀死,而无需执行另一行代码。
因此,您应该使用该onPause()
方法将任何持久性数据(例如用户编辑)写入存储。此外,该方法onSaveInstanceState(Bundle)
在将 Activity 置于此类后台状态之前调用,允许您将 Activity 中的任何动态实例状态保存到给定的 Activity 中Bundle
,以便稍后在onCreate(Bundle)
需要重新创建 Activity 时接收。
请注意,将持久数据保存在其中很重要onPause()
,onSaveInstanceState(Bundle)
因为后者不是生命周期回调的一部分,因此不会在其文档中描述的所有情况下都被调用。
我想添加更多方法。这些未列为生命周期方法,但根据某些条件,它们将在生命周期中被调用。根据您的要求,您可能必须在应用程序中实现这些方法才能正确处理状态。
onPostCreate(Bundle savedInstanceState)
在活动启动完成时调用(在调用
onStart()
之后onRestoreInstanceState(Bundle)
)。
onPostResume()
在活动恢复完成时调用(在
onResume()
调用之后)。
onSaveInstanceState(Bundle outState)
调用以在被杀死之前从活动中检索每个实例的状态,以便可以在
onCreate(Bundle)
或中恢复状态onRestoreInstanceState(Bundle)
(由此方法填充的 Bundle 将传递给两者)。
onRestoreInstanceState(Bundle savedInstanceState)
onStart()
当活动从先前保存的状态重新初始化时调用此方法,在此处给出savedInstanceState
。
我的应用程序代码使用了所有这些方法:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText txtUserName;
private EditText txtPassword;
Button loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Ravi","Main OnCreate");
txtUserName=(EditText) findViewById(R.id.username);
txtPassword=(EditText) findViewById(R.id.password);
loginButton = (Button) findViewById(R.id.login);
loginButton.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.d("Ravi", "Login processing initiated");
Intent intent = new Intent(this,LoginActivity.class);
Bundle bundle = new Bundle();
bundle.putString("userName",txtUserName.getText().toString());
bundle.putString("password",txtPassword.getText().toString());
intent.putExtras(bundle);
startActivityForResult(intent,1);
// IntentFilter
}
public void onActivityResult(int requestCode, int resultCode, Intent resIntent){
Log.d("Ravi back result:", "start");
String result = resIntent.getStringExtra("result");
Log.d("Ravi back result:", result);
TextView txtView = (TextView)findViewById(R.id.txtView);
txtView.setText(result);
Intent sendIntent = new Intent();
//sendIntent.setPackage("com.whatsapp");
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "Message...");
sendIntent.setType("text/plain");
startActivity(sendIntent);
}
@Override
protected void onStart() {
super.onStart();
Log.d("Ravi","Main Start");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("Ravi","Main ReStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d("Ravi","Main Pause");
}
@Override
protected void onResume() {
super.onResume();
Log.d("Ravi","Main Resume");
}
@Override
protected void onStop() {
super.onStop();
Log.d("Ravi","Main Stop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("Ravi","Main OnDestroy");
}
@Override
public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
Log.d("Ravi","Main onPostCreate");
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("Ravi","Main PostResume");
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
}
登录活动:
public class LoginActivity extends AppCompatActivity {
private TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
txtView = (TextView) findViewById(R.id.Result);
Log.d("Ravi","Login OnCreate");
Bundle bundle = getIntent().getExtras();
txtView.setText(bundle.getString("userName")+":"+bundle.getString("password"));
//Intent intent = new Intent(this,MainActivity.class);
Intent intent = new Intent();
intent.putExtra("result","Success");
setResult(1,intent);
// finish();
}
}
输出:(暂停前)
D/Ravi: Main OnCreate
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
输出:(从暂停恢复后)
D/Ravi: Main ReStart
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
请注意,onPostResume()
即使它没有被引用为生命周期方法,它也会被调用。
我按照上面的答案运行了一些日志,这是输出:
开始活动
On Activity Load (First Time)
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
Reload After BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
OnMaximize(Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
OnMaximize(Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
停止活动
On BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
D/IndividualChatActivity: onDestroy:
OnMinimize (Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
OnMinimize (Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
Going To Another Activity
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
Close The App
————————————————————————————————————————————————
D/IndividualChatActivity: onDestroy:
在我个人看来,onStart 和 onStop 只需要两个。
onResume 似乎在每个返回实例中,而 onPause 在每个离开实例中(关闭应用程序除外)。