Android活动的生命周期是什么?为什么在初始化过程中调用这么多类似的方法(onCreate(), onStart(), onResume()),而在最后调用这么多其他方法(onPause(), onStop(), onDestroy()) ?

什么时候调用这些方法,应该如何正确地使用它们?


当前回答

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

在android sdk框架中,每个android Activity(窗口)都有生命周期方法。这意味着,当用户进入一个应用程序,他可以看到在onCreate()生命周期方法中创建的活动。只在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())在结束时调用?

用户第一次进入应用程序:

当打开应用程序时,我们可以看到一个窗口(Activity)。onCreate (created) -> onStart(started) -> onResume(resume state)将被调用。

从后台关闭应用程序:

当从后台关闭应用程序时,必须销毁活动以释放一些内存。因此,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()

主页按钮:

当用户点击Home键时:

onPause()

onStop()

用户搜索主屏幕,点击应用程序图标回到活动:

onRestart()

onStart()

onResume()

用户收到电话:

当用户在一个活动,电话来了:

onPause()

onStop()

如果用户没有参加呼叫,它会自动断开并返回活动(未接呼叫):

onRestart()

onStart()

onResume()

如果用户不参加呼叫:

-不调用任何生命周期。

关机按钮:

当用户关闭按钮时:

onPause()

onStop()

解锁设备时:

onRestart()

onStart()

onResume()

弹出对话框:

当弹出对话框出现-没有生命周期将被调用

重启设备或关闭开关:

用户重启或关闭设备时:

onPause()

onStop()

当用户从主屏幕点击应用程序图标时:

onCreate()

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] 

活动图可以解释为:

安卓系统生命周期

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

onCreate () onStart () onResume () onRestart () onPause () 原() onDestroy ()


回答所有这些方法都是为了什么:

让我们以一个简单的场景为例,在这个场景中,了解这些方法的调用顺序将有助于我们清楚地了解为什么要使用它们。

假设你正在使用一个计算器应用程序。调用了三个方法 连续启动应用程序。

on开始()

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

onPause() - - - > onStop()

现在假设我完成了电话上的对话,计算器 Activity从后台进入前台,有三种方法 依次调用。

重新启动()- - - > onStart() - - - - > on简历()

最后,假设我已经完成了计算器应用程序中的所有任务,并且我 想要退出应用程序。进一步的两个方法被连续调用。

连续()- - - >致残()


一个活动可能存在四种状态:

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

起始状态包括:

创建一个新的Linux进程,为新的UI对象分配新的内存,并设置整个屏幕。大部分的工作都在这里。

运行状态包括:

它是当前在屏幕上的活动(状态)。这个状态单独处理在屏幕上输入、触摸和点击按钮等事情。

暂停状态包括:

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

停止状态包括:

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

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

我按照上面的答案运行一些日志,下面是输出:

开始活动

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在每一个实例离开(除了关闭应用程序)。

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

来源:developer.android.com

注意上表中的“Killable”列——对于那些被标记为可杀死的方法,在该方法返回后,承载该活动的进程可能在任何时候被系统杀死,而无需执行它的另一行代码。

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

注意,在onPause()而不是onSaveInstanceState(Bundle)中保存持久数据是很重要的,因为后者不是生命周期回调的一部分,所以不会像其文档中描述的那样在每种情况下被调用。

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

onPostCreate(Bundle savedInstanceState)

当活动启动完成时调用(在onStart()和onRestoreInstanceState(Bundle)被调用之后)。

onPostResume()

当activity resume完成时调用(在onResume()被调用之后)。

onSaveInstanceState(Bundle outState)

调用该方法在activity被杀死之前从activity中检索每个实例的状态,以便状态可以在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()被调用,即使它没有被引用为生命周期方法。

活动有六个状态

创建 开始 恢复 停顿了一下 停止 摧毁了

活动生命周期有七个方法

onCreate () onStart () onResume () onPause () 原() onRestart () onDestroy ()

图源

的情况下

When open the app onCreate() --> onStart() --> onResume() When back button pressed and exit the app onPaused() -- > onStop() --> onDestory() When home button pressed onPaused() --> onStop() After pressed home button when again open app from recent task list or clicked on icon onRestart() --> onStart() --> onResume() When open app another app from notification bar or open settings onPaused() --> onStop() Back button pressed from another app or settings then used can see our app onRestart() --> onStart() --> onResume() When any dialog open on screen onPause() After dismiss the dialog or back button from dialog onResume() Any phone is ringing and user in the app onPause() --> onResume() When user pressed phone's answer button onPause() After call end onResume() When phone screen off onPaused() --> onStop() When screen is turned back on onRestart() --> onStart() --> onResume()