Android活动生命周期 - 这些方法有哪些?

问题描述 投票:395回答:8

Android活动的生命周期是什么?为什么在初始化期间调用了这么多类似的声音方法(onCreate()onStart()onResume()),还有很多其他的(onPause()onStop()onDestroy())在最后调用?

这些方法何时被调用,它们应该如何正确使用?

android lifecycle oncreate onresume ondestroy
8个回答
727
投票

Activity Lifecycle(Android开发者处)中查看。

onCreate()

在第一次创建活动时调用。这是您应该执行所有常规静态设置的地方:创建视图,将数据绑定到列表等。此方法还为您提供包含活动先前冻结状态的Bundle(如果有)。始终紧跟onStart()。

onRestart()

在您的活动停止后再次启动之前调用。始终紧跟onStart()

onStart()

当活动变得对用户可见时调用。如果活动到达前台,则依次使用onResume()。

onResume()

当活动开始与用户交互时调用。此时,您的活动位于活动堆栈的顶部,用户输入转到活动堆栈。始终跟随onPause()。

onPause ()

当活动进入后台但被(但)尚未被杀死时,被称为活动生命周期的一部分。 onResume()的对应部分。当活动B在活动A前面启动时,将在A上调用此回调。在A的onPause()返回之前不会创建B,所以一定不要在这里做任何冗长的事情。

onStop()

当您不再对用户可见时调用。您接下来将收到onRestart(),onDestroy()或什么都没有,具体取决于以后的用户活动。请注意,在内存不足的情况下,可能永远不会调用此方法,在这种情况下,系统没有足够的内存来保持活动进程在调用onPause()方法后运行。

onDestroy()

在您的活动被销毁之前收到的最后一个电话。这可能是因为活动正在完成(有人在其上调用finish(),或者因为系统暂时销毁此活动实例以节省空间。您可以使用isFinishing()方法区分这两种情况。

当Activity第一次加载事件时,调用如下:

onCreate()
onStart()
onResume()

当您单击“电话”按钮时,“活动”将转到后台并调用以下事件:

onPause()
onStop()

退出电话拨号程序,将调用以下事件:

onRestart()
onStart()
onResume()

当您单击后退按钮或尝试完成()活动时,将调用事件,如下所示:

onPause()
onStop()
onDestroy()

Activity States

Android OS使用优先级队列来协助管理设备上运行的活动。根据特定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");
    }
}

150
投票

由于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] 

活动图可以解释为:


146
投票

活动有六个州

  • 创建
  • 入门
  • 恢复
  • 已暂停
  • 停止
  • 摧毁

活动生命周期有七种方法

  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onRestart()
  • onDestroy()

情况

  • 打开应用程序时 onCreate() --> onStart() --> onResume()
  • 按下后退按钮并退出应用程序 onPaused() -- > onStop() --> onDestory()
  • 按下主页按钮 onPaused() --> onStop()
  • 按下主页按钮后,再次打开最近任务列表中的应用程序或单击图标 onRestart() --> onStart() --> onResume()
  • 从通知栏打开app app或打开设置 onPaused() --> onStop()
  • 从其他应用程序或设置按下后退按钮然后使用可以看到您的应用程序 qazxsw poi
  • 屏幕上打开任何对话框时 onRestart() --> onStart() --> onResume()
  • 从对话框中关闭对话框或后退按钮后 onPause()
  • 任何手机都在应用程序中响铃和用户 onResume()
  • 当用户按下电话的答案按钮时 onPause() --> onResume()
  • 通话结束后 onPause()
  • 手机屏幕关闭时 onResume()
  • 当屏幕重新打开时 onPaused() --> onStop()

20
投票

onRestart() --> onStart() --> onResume()

有七种方法可以管理Android应用程序的生命周期:


回答所有这些方法:

让我们看一个简单的场景,知道调用这些方法的顺序将有助于我们清楚地说明它们的用法。

  • 假设您使用的是计算器应用程序。连续调用三种方法来启动应用程序。

onDestroy() - - - > onCreate() - - - > onStart()

  • 当我使用计算器应用程序时,突然有一个电话来了。计算器活动转到后台,另一个活动说。处理呼叫到达前台,现在连续调用两个方法。

onResume() - - - > onPause()

  • 现在说我在电话上完成了对话,计算器活动从后台开始变为前景,因此连续调用了三种方法。

onStop() - - - > onRestart() - - - > onStart()

  • 最后,说我已完成计算器应用程序中的所有任务,我想退出应用程序。接下来两个方法被连续调用。

onResume() - - - > onStop()


有四种状态可能存在活动:

  • 开始状态
  • 运行状态
  • 暂停状态
  • 停止状态

起始状态涉及:

创建新的Linux进程,为新UI对象分配新内存,以及设置整个屏幕。所以大部分工作都涉及到这里。

运行状态包括:

它是屏幕上当前的活动(状态)。仅此状态处理诸如在屏幕上键入,以及触摸和单击按钮等操作。

暂停状态包括:

当一个活动不在前台而不是在后台时,则该活动被称为处于暂停状态。

停止状态涉及:

停止的活动只能通过重新启动来购买到前台,并且它可以在任何时间点被销毁。

活动管理器以这样一种方式处理所有这些状态,即使在将新活动添加到现有活动的情况下,用户体验和性能始终处于最佳状态


12
投票

我喜欢这个问题及其答案,但到目前为止还没有像onPostCreate()或onPostResume()那样频繁使用的回调。 Steve Pomeroy在onDestroy()尝试了一个图表,其中包括这些以及它们与Android的Fragment生命周期的关系。我修改了史蒂夫的大图,只包括活动部分,并将其格式化为字母大小的单页打印输出。我在https://github.com/xxv/android-lifecycle发布了它作为文本PDF,下面是它的图像:

https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf


6
投票

从Android Developers页面,

在onPause():

当系统即将开始恢复先前的活动时调用。这通常用于将未保存的更改提交到持久数据,停止动画以及可能消耗CPU等的其他事情。此方法的实现必须非常快,因为在此方法返回之前,下一个活动将不会恢复。如果活动返回到前面,则后跟onResume(),如果对用户不可见,则返回onStop()。

onStop():

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

现在假设有三个活动,你从A到B,然后onPause现在将被调用从B到C,然后onPause of B和onStop将被调用。

暂停的Activity获取Resume,Stopped重新启动。

当你调用Android Activity Lifecycle时,将调用onPause-onStop-onDestroy。要记住的主要事项是:只要Android需要内存用于其他操作,暂停活动就会停止并且停止活动会被销毁。

我希望它足够清楚。


2
投票

在高评级答案之上添加更多信息(添加了KILLABLE的附加部分和下一组方法,这些方法将在生命周期中调用):

资料来源:this.finish()

developer.android.com

请注意上表中的“Killable”列 - 对于那些被标记为可填充的方法,在该方法返回之后,托管该活动的进程可能在任何时候被系统杀死而不执行其代码的另一行。

因此,您应该使用enter image description here方法将任何持久性数据(例如用户编辑)写入存储。此外,在将活动置于这样的背景状态之前调用方法onPause(),允许您将活动中的任何动态实例状态保存到给定的onSaveInstanceState(Bundle)中,以便稍后在Bundle中接收(如果需要重新创建活动) 。

请注意,将持久数据保存在onCreate(Bundle)而不是onPause()中非常重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的所有情况下调用。

我想补充几点方法。这些未列为生命周期方法,但根据某些条件,它们将在生命周期中被调用。根据您的要求,您可能必须在应用程序中实现这些方法以正确处理状态。

onSaveInstanceState(Bundle)

在活动启动完成时调用(在调用onPostCreate(Bundle savedInstanceState) onStart()之后)。

onRestoreInstanceState(Bundle)

活动恢复完成后调用(在调用onPostResume() 之后)。

onResume()

被调用以在被杀死之前从活动中检索每个实例状态,以便可以在onSaveInstanceState(Bundle outState) onCreate(Bundle)中恢复状态(由此方法填充的Bundle将被传递给两者)。

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 作为生命周期方法,也会调用onPostResume()


0
投票

Android活动的生命周期是什么?

在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:

打开应用程序时,我们可以看到一个窗口(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()

概述按钮:

当用户单击Overview Button(硬件第三个按钮 - 最近列表)时:

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()
© www.soinside.com 2019 - 2024. All rights reserved.