Android活动的生命周期是什么?为什么在初始化期间调用了很多类似的声音方法(onCreate()
,onStart()
,onResume()
)以及许多其他方法(onPause()
,onStop()
,{{1最后调用了吗?
这些方法何时被调用,以及如何正确使用它们?
答案 0 :(得分:724)
在 Activity Lifecycle (在Android开发者处)中查看。
<强> onCreate() 强>:
首次创建活动时调用。这是你应该做的 所有正常的静态设置:创建视图,将数据绑定到列表, 此方法还为您提供了包含的Bundle 活动的先前冻结状态,如果有的话。一直跟着 by onStart()。
<强> onRestart() 强>:
在您的活动停止之后,在启动之前调用 再次。始终紧跟onStart()
<强> onStart() 强>:
当活动对用户可见时调用。其次是 onResume(),如果活动到达前台。
<强> onResume() 强>:
当活动开始与用户交互时调用。在这 使用用户指出您的活动位于活动堆栈的顶部 输入到它。始终跟随onPause()。
<强> onPause () 强>
当活动进行时,被称为活动生命周期的一部分 进入背景, 但是还没有被杀死。 onResume()的对应部分。 当活动B在活动A前面启动时,将在A上调用此回调。 在A的onPause()返回之前不会创建B,所以一定不要 在这里做任何冗长的事情。
<强> onStop() 强>:
当您不再对用户可见时调用。你接下来会 接收onRestart(),onDestroy()或什么都没有,具体取决于 以后的用户活动。 请注意,在低内存情况下,可能永远不会调用此方法 系统没有足够的内存来保持您的活动 调用onPause()方法后运行的进程。
<强> onDestroy() 强>:
在您的活动被销毁之前收到的最后一个电话。这个 可能发生,因为活动正在结束(有人打电话给 在它上面完成(),或者因为系统正在暂时破坏它 节省空间的活动实例。你可以区分&gt;这两个场景使用isFinishing()方法。
当活动首次加载时,会调用事件,如下所示:
onCreate()
onStart()
onResume()
当您点击“电话”按钮时,“活动”会转到后台并调用以下事件:
onPause()
onStop()
退出电话拨号器,系统会调用以下事件:
onRestart()
onStart()
onResume()
当您点击后退按钮或尝试完成()时,会调用事件的活动,如下所示:
onPause()
onStop()
onDestroy()
<强> Activity States 强>
Android操作系统使用优先级队列来协助管理设备上运行的活动。根据特定Android活动所处的状态,将在OS中为其分配一定的优先级。此优先级系统可帮助Android识别不再使用的活动,从而允许操作系统回收内存和资源。下图说明了活动在其生命周期内可以经历的状态:
这些状态可分为以下三个主要组:
活动或正在运行 - 如果活动位于前台(也称为活动堆栈的顶部),则活动被视为活动或正在运行。这被认为是Android Activity堆栈中的最高优先级活动,因此在极端情况下只会被操作系统杀死,例如,如果活动尝试使用的内存多于设备上可用的内存,因为这可能导致UI变得反应迟钝。
已暂停 - 当设备进入休眠状态,或者活动仍然可见但被新的非全尺寸或透明活动部分隐藏时,该活动将被视为已暂停。暂停的活动仍然存在,即它们维护所有状态和成员信息,并保持与窗口管理器的连接。这被认为是Android 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");
}
}
答案 1 :(得分:148)
由于Google选择了非直观的名称而不是如下所示,因此导致了整个混乱:
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]
活动图可以解释为:
答案 2 :(得分:144)
活动有六种状态
活动生命周期有七种方法
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()
答案 3 :(得分:18)
有七种方法可以管理Android应用程序的生命周期:
让我们假设一个简单的场景,知道调用这些方法的顺序将有助于我们清楚地说明它们的用法。
onCreate()
- - - &gt; onStart()
- - - &gt; onResume()
onPause()
- - - &gt; onStop()
onRestart()
- - - &gt; onStart()
- - - &gt; onResume()
onStop()
- - - &gt; onDestroy()
开始状态涉及:
创建新的Linux进程,为新UI对象分配新内存,以及设置整个屏幕。所以大部分工作都涉及到这里。
运行状态涉及:
这是屏幕上当前的活动(状态)。仅此状态处理诸如在屏幕上键入以及触摸&amp;点击按钮。
暂停状态涉及:
如果某个活动不在前台,而是在后台,那么该活动就会处于暂停状态。
停止状态涉及:
停止的活动只能通过重新启动来买入前景,并且可以在任何时间点销毁。
活动管理器处理所有这些状态,即使在将新活动添加到现有活动的情况下,用户体验和性能始终处于最佳状态
答案 4 :(得分:11)
我喜欢这个问题及其答案,但到目前为止还没有涵盖不常用的回调,例如 onPostCreate() 或 onPostResume() 即可。 Steve Pomeroy在https://github.com/xxv/android-lifecycle尝试了一个包含这些以及它们与Android的 Fragment 生命周期的关系的图表。我修改了史蒂夫的大图,仅包含活动部分,并将其格式化为字母大小的单页打印输出。我已将其作为文本PDF发布在https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf,下面是其图像:
答案 5 :(得分:7)
从Android开发者页面
的onPause():
系统即将开始恢复上一个活动时调用。 这通常用于将未保存的更改提交到持久数据, 停止动画和其他可能消耗CPU等的东西 这种方法的实现必须非常快,因为下一步 在此方法返回之前,不会恢复活动。其次是 onResume(),如果活动返回到前面,或者 onStop(),如果它对用户不可见。
的onStop():
当活动不再对用户可见时调用,因为 另一项活动已经恢复并涵盖了这一项。这可能 发生的原因是因为正在开始新活动,现有活动 被带到这一个面前,或者这个被摧毁。 如果此活动返回,则跟随onRestart() 如果此活动消失,则与用户或onDestroy()进行交互。
现在假设有三个活动,你从A到B,然后onPause现在将从B调用到C,然后onPause of B和onStop将被调用。
暂停的Activity获取Resume并且Stopped重新启动。
当您致电this.finish()
时,将调用onPause-onStop-onDestroy。要记住的主要事项是:只要Android需要内存用于其他操作,暂停的活动就会停止并且停止活动会被销毁。
我希望它足够清楚。
答案 6 :(得分:1)
在高评级答案之上添加更多信息(添加了KILLABLE的附加部分以及将在生命周期中调用的下一组方法):
请注意上表中的“ Killable ”列 - 对于那些被标记为可填充的方法,在该方法返回之后,托管该活动的进程可能会在任何时候被系统杀死没有执行其代码的另一行。
因此,您应该使用onPause()
方法将任何持久性数据(例如用户编辑)写入存储。此外,在将活动置于此背景状态之前调用方法onSaveInstanceState(Bundle)
,允许您将活动中的任何动态实例状态保存到给定的Bundle
中,以便稍后在{{{ 1}}如果需要重新创建活动。
请注意,在onCreate(Bundle)
而不是onPause()
中保存持久数据非常重要,因为后者不是生命周期回调的一部分,因此不会在文档中描述的每种情况下调用。
我想补充几点方法。这些未列为生命周期方法,但根据某些条件,它们将在生命周期中被调用。根据您的要求,您可能必须在应用程序中实现这些方法以正确处理状态。
onSaveInstanceState(Bundle)
活动启动完成后调用(调用
onPostCreate(Bundle savedInstanceState)
和onStart()
后)。
onRestoreInstanceState(Bundle)
活动恢复完成后调用(调用
onPostResume()
后)。
onResume()
被调用以在被杀死之前从活动中检索每个实例状态,以便可以在
onSaveInstanceState(Bundle outState)
或onCreate(Bundle)
中恢复状态(此方法填充的Bundle将被传递给两者)。 / p>
onRestoreInstanceState(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
被调用,即使它未被引用为生命周期方法。
答案 7 :(得分:1)
启动应用程序:
当用户首次进入活动或应用程序时:
onCreate(),
onStart() and
onResume()
当您从android studio运行应用程序时:
onCreate(),
onStart() and
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()
如果用户未参加呼叫:
不适用-不会调用任何生命周期。
电源关闭按钮:
当用户关闭按钮电源时:
onPause()
onStop()
解锁设备时:
onRestart()
onStart()
onResume()
弹出对话框:
出现弹出对话框时-不会调用任何生命周期
重启设备或关闭设备:
用户重新启动或关闭设备时:
onPause()
onStop()
用户在主屏幕上单击应用程序图标时:
onCreate()
onStart()
onResume()
答案 8 :(得分:0)
我按照上面的答案运行了一些日志,这是输出:
开始活动
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出现在每个离开的实例中(关闭应用程序除外)。