Android 活动生命周期 - 所有这些方法的用途是啥?
Posted
技术标签:
【中文标题】Android 活动生命周期 - 所有这些方法的用途是啥?【英文标题】:Android activity life cycle - what are all these methods for?Android 活动生命周期 - 所有这些方法的用途是什么? 【发布时间】:2012-01-20 21:41:21 【问题描述】:android Activity 的生命周期是什么?为什么初始化时调用了这么多类似的发声方法(onCreate()
、onStart()
、onResume()
),而最后调用了这么多其他方法(onPause()
、onStop()
、onDestroy()
)?
这些方法是什么时候调用的,应该如何正确使用?
【问题讨论】:
为什么这个问题被投票这么多次?为什么还没有关闭? 为什么要以很多赞成票来结束一个问题? *** 有个坏习惯。 这是一个 wiki 风格的问题,我觉得应该允许在网站上使用它。 @Alexander Kulyakhtin - 为什么要结束这个问题?相反,如果您无法消化新 android 人员答案中提供的信息,则应该关闭您的帐户。这个问题充满了知识,我要投票赞成这个问题。 这些方法什么时候叫问题,你试过什么? 【参考方案1】:在 Activity Lifecycle 中查看它(在 Android Developers)。
onCreate():
在首次创建活动时调用。这是你应该做的 所有正常的静态设置:创建视图,将数据绑定到列表, 等等。此方法还为您提供了一个 Bundle,其中包含 活动的先前冻结状态,如果有的话。一直关注 通过 onStart()。
onRestart():
在您的活动停止之后、开始之前调用 再次。总是跟着 onStart()
onStart():
当活动对用户可见时调用。其次是 onResume() 如果活动进入前台。
onResume():
在 Activity 开始与用户交互时调用。在这 指出您的活动位于活动堆栈的顶部,用户 输入去它。总是跟在 onPause() 之后。
onPause ():
在活动进行时作为活动生命周期的一部分调用 进入后台, 但还没有(还)被杀。 onResume() 的对应项。 当活动 B 在活动 A 之前启动时,将在 A 上调用此回调。 在 A 的 onPause() 返回之前不会创建 B,因此请务必不要 在这里做任何冗长的事情。
onStop():
当您不再对用户可见时调用。接下来你会 接收 onRestart()、onDestroy() 或什么都不接收,具体取决于 以后的用户活动。 请注意,在内存不足的情况下,可能永远不会调用此方法 系统没有足够的内存来保存您的活动 在调用其 onPause() 方法后运行的进程。
onDestroy():
在您的活动被销毁之前收到的最后一个电话。这 可能会发生,因为活动正在结束(有人叫 finish() 就可以了,或者因为系统暂时破坏了它 活动实例以节省空间。您可以使用 isFinishing() 方法区分>这两种情况。
当Activity第一次加载事件被调用如下:
onCreate()
onStart()
onResume()
当您点击电话按钮时,Activity 进入后台并调用以下事件:
onPause()
onStop()
退出电话拨号器,将调用以下事件:
onRestart()
onStart()
onResume()
当您单击后退按钮或尝试finish()活动时,事件的调用如下:
onPause()
onStop()
onDestroy()
Activity States
Android 操作系统使用优先级队列来协助管理设备上运行的活动。根据特定 Android 活动所处的状态,它会在操作系统内被分配一定的优先级。此优先系统可帮助 Android 识别不再使用的活动,从而允许操作系统回收内存和资源。下图说明了活动在其生命周期中可以经历的状态:
这些状态可以分为以下三个主要组:
活动或正在运行 - 如果活动位于前台(也称为活动堆栈的顶部),则将其视为活动或正在运行。这被认为是 Android Activity 堆栈中优先级最高的 Activity,因此只会在极端情况下被操作系统杀死,例如,如果 Activity 尝试使用比设备上可用的内存更多的内存,因为这可能会导致 UI变得没有反应。
暂停 - 当设备进入睡眠状态,或者某个 Activity 仍然可见但被新的、非全尺寸或透明的 Activity 部分隐藏时,该 Activity 被视为已暂停。暂停的活动仍然存在,也就是说,它们维护所有状态和成员信息,并保持连接到窗口管理器。这被认为是 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");
【讨论】:
所以如果我理解正确 onStop() 总是在 onPause() 之后调用? 不总是,“onStop():当你不再对用户可见时调用” 在 onCreate 之前有什么机会被调用吗? 是的 - 默认构造函数(即没有参数的构造函数)。但它仅用于非常基本的初始化目的。通常你应该不使用它,除非你真的知道你在做什么。即使这样,如果有更好的做事方式,您也应该三思。 我认为这个链接可以帮助您更好地了解活动的生命周期。 iphtechnologies.com/understanding-lifecycle-in-android-activity【参考方案2】: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()
【讨论】:
'当屏幕上打开任何对话框时,调用 onPause()',对于警报对话框不成立。只有当对话框本身是一个对话框活动时才会调用它(主题设置为@android:style/Theme.Dialog)。 有价值的答案。请将此提交给谷歌以添加到他们的文档中。我正在将您的答案保存到 Word 文档中! 我不明白“任何电话正在响铃并且用户在应用程序中”。具体是什么场景?我的第一个想法是,如果用户在应用程序中并且电话开始响铃,那么将是 onPause()-->onStop() 以防全屏成为呼叫。对于单挑来电消息可能只是 OnResume-->onPause() 但我不确定这一点。调用 onPause-->onResume 是什么情况?通话结束了吗? 这就是我要找的。只是想知道我应该把我的 api 调用放在哪里。 我喜欢你的基于场景的回答。【参考方案3】:整个混乱是因为谷歌选择了非直观的名称而不是如下内容:
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]
活动图可以解释为:
【讨论】:
视情况而定。除非它能解决混乱,否则长名字不会受到伤害。例如:onRoutePresentationDisplayChanged() 在很大程度上是 Android SDK 内部的一个函数 我个人并不觉得你的名字更直观,加上片段,它并没有真正相关。 赞成。比官方文档更有帮助 这是一篇很棒的文章。一个问题。当您在 Google 中输入 Andoid 生命周期方法时,此图像会出现在搜索选项上方(即使在图像搜索模式下)作为 Android 生命周期方法的答案。不知情的人(或懒惰,取决于你如何看待它)可能很容易被误导,除非他们点击 *** 链接而不是点击流程图图像(你的图像)。 是的。这就是我一直在寻找的。有人应该用这样的东西写一本书(或文档?)。 onResume 等没有意义。【参考方案4】:ANDROID LIFE-CYCLE
有七种方法可以管理 Android 应用程序的生命周期:
onCreate() onStart() onResume() onRestart() onPause() onStop() onDestroy()回答所有这些方法的用途:
让我们举一个简单的场景,知道这些方法的调用顺序将有助于我们清楚地说明使用它们的原因。
假设您正在使用计算器应用程序。三个方法被调用 连续启动应用程序。onCreate()
- - - > onStart()
- - - > @987654331 @
onPause()
- - - > onStop()
onRestart()
- - - > onStart()
- - - > @987654336 @
onStop()
- - - > onDestroy()
一个活动可能存在的四种状态:
起始状态 运行状态 暂停状态 停止状态起始状态涉及:
创建一个新的 Linux 进程,为新的 UI 对象分配新的内存,并设置整个屏幕。所以大部分工作都在这里。
运行状态涉及:
它是当前在屏幕上的活动(状态)。这种状态单独处理诸如在屏幕上打字、触摸和点击按钮等事情。
暂停状态涉及:
当 Activity 不在前台而是在后台时,则称该 Activity 处于暂停状态。
停止状态涉及:
一个停止的活动只能通过重新启动它来购买到前台,它也可以在任何时间点被销毁。
活动管理器以这样一种方式处理所有这些状态,即使在将新活动添加到现有活动的情况下,用户体验和性能也始终处于最佳状态
【讨论】:
onPause 到 onResume 的任何示例?【参考方案5】:我喜欢这个问题和它的答案,但到目前为止,还没有涉及不太常用的回调,如 onPostCreate() 或 onPostResume()。 Steve Pomeroy 在https://github.com/xxv/android-lifecycle 尝试了一个图表,其中包括这些以及它们与 Android Fragment 生命周期的关系。我修改了史蒂夫的大图,只包含 Activity 部分,并将其格式化为字母大小的一页打印输出。我已将它作为文本 PDF 发布在 https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf,下面是它的图片:
【讨论】:
【参考方案6】:来自 Android 开发者页面,
onPause():
当系统即将开始恢复之前的活动时调用。 这通常用于提交未保存的对持久数据的更改, 停止动画和其他可能消耗 CPU 等的东西。 这种方法的实现必须非常快,因为下一个 在此方法返回之前,活动不会恢复。其次是 如果活动返回到前面,则 onResume(),或者 onStop() 如果它对用户不可见。
onStop():
当 Activity 不再对用户可见时调用,因为 另一项活动已恢复并正在涵盖这一活动。这可能 发生要么是因为正在启动一项新活动,要么是现有活动 被带到这个面前,或者这个正在被摧毁。 如果此活动返回,则后跟 onRestart() 与用户交互,如果此活动消失,则使用 onDestroy()。
现在假设有 3 个活动,你从 A 到 B,那么现在从 B 到 C 会调用 A 的 onPause,然后会调用 B 的 onPause 和 A 的 onStop。
暂停的 Activity 会获得 Resume,Stopped 会重新启动。
当您调用this.finish()
时,将调用 onPause-onStop-onDestroy。要记住的主要事情是:当 Android 需要内存用于其他操作时,暂停的活动会被停止,而停止的活动会被销毁。
我希望它足够清楚。
【讨论】:
我们能否将 onPause 方法称为 Activity 开始失去焦点并最终对用户不可见的中间阶段,以及当 Activity 对用户完全不可见时的 Onstop 方法 我觉得应该是这样的。 @Nav 假设有 3 个活动,您从 A 到 B,那么现在从 B 到 C 将调用 A 的 onPause,然后将调用 B 的 onPause 和 A 的 onStop。【参考方案7】: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()
用户接到电话:
当用户在 Activity 中时,来电:
onPause()
onStop()
如果用户没有接听电话,它会自动断开连接并返回活动(未接电话):
onRestart()
onStart()
onResume()
如果用户没有接听电话:
N/A - 不会调用任何生命周期。
关机按钮:
当用户关闭按钮时:
onPause()
onStop()
解锁设备时:
onRestart()
onStart()
onResume()
弹出对话框:
当弹出对话框出现时 - 不会调用生命周期
重启设备或关机:
当用户重启或关闭设备时:
onPause()
onStop()
当用户从主屏幕点击应用图标时:
onCreate()
onStart()
onResume()
【讨论】:
【参考方案8】:在高度评价的答案之上添加更多信息(添加了 KILLABLE 的附加部分和下一组方法,将在生命周期中调用):
来源:developer.android.com
注意上表中的“Killable”列——对于那些被标记为可杀死的方法,在该方法返回后,承载该活动的进程可能随时被系统杀死没有另一行代码被执行。
因此,您应该使用onPause()
方法将任何持久性数据(例如用户编辑)写入存储。此外,onSaveInstanceState(Bundle)
方法在将活动置于这样的后台状态之前被调用,允许您将活动中的任何动态实例状态保存到给定的Bundle
,如果活动稍后在onCreate(Bundle)
中接收需要重新创建。
请注意,将持久性数据保存在 onPause()
而不是 onSaveInstanceState(Bundle)
中很重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的所有情况下都被调用。
我想添加更多方法。这些未列为生命周期方法,但根据某些条件,它们将在生命周期中被调用。根据您的要求,您可能必须在应用程序中实现这些方法才能正确处理状态。
onPostCreate(Bundle savedInstanceState)
在 Activity 启动完成时调用(在调用
onStart()
和onRestoreInstanceState(Bundle)
之后)。
onPostResume()
在活动恢复完成时调用(在调用
onResume()
之后)。
onSaveInstanceState(Bundle outState)
调用以在被杀死之前从 Activity 检索每个实例的状态,以便可以在
onCreate(Bundle)
或onRestoreInstanceState(Bundle)
中恢复状态(此方法填充的 Bundle 将传递给两者)。
onRestoreInstanceState(Bundle savedInstanceState)
此方法在
onStart()
之后调用,此时 Activity 从先前保存的状态重新初始化,此处在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()
被调用,即使它没有被引用为生命周期方法。
【讨论】:
【参考方案9】:我按照上面的答案运行了一些日志,这是输出:
开始活动
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 在每个离开实例中(关闭应用程序除外)。
【讨论】:
以上是关于Android 活动生命周期 - 所有这些方法的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章