Android活动生命周期--这些方法都是为了什么?

wgx48brx  于 2022-12-21  发布在  Android
关注(0)|答案(9)|浏览(140)

Android Activity的生命周期是什么?为什么在初始化时调用了这么多类似的探测方法(onCreate()onStart()onResume()),而在最后调用了这么多其他方法(onPause()onStop()onDestroy())?
何时调用这些方法,以及如何正确使用它们?

ozxc1zmp

ozxc1zmp1#

活动有六种状态

    • 创建日期 *
    • 开始 *
    • 续会 *
    • 暂停 *
    • 停止 *
    • 毁灭 *
      活动生命周期有七种方法
  • 第一个月
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onRestart()
  • onDestroy()

diagram source

情况
*打开应用程序时

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()
fivyi3re

fivyi3re2#

整个混乱是由于谷歌选择了非直观的名称,而不是如下所示:

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]

活动图可解释为:

pbwdgjma

pbwdgjma3#

安卓生命周期

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

*创建()时
*在开始()时
*关于简历()
*重新启动时()
*在暂停()时
*on停止()
*在销毁()时

回答所有这些方法的用途:

让我们举一个简单的场景,知道这些方法的调用顺序将帮助我们清楚地给予使用它们的原因。

  • 假设您正在使用一个计算器应用程序,将连续调用三个方法来启动该应用程序。
    一个月一次**-- -〉一个月一次*-- -〉**一个月二次
  • 我在使用计算器应用的时候,突然有一个调用,计算器活动到后台,另一个活动说,处理调用到前台,现在连续调用了两个方法。
    一米三氮一x**- - -〉**一米四氮一x
  • 现在假设我结束了电话中的对话,计算器活动从后台转到前台,那么连续调用三个方法。
    一个五分之一x**- - -〉一个六分之一x- - -〉**一个七分之一x
  • 最后,假设我已经完成了计算器应用程序中的所有任务,我想退出应用程序,然后连续调用两个方法。
    一米八氮一x**- - -〉**一米九氮一x

活动可能存在四种状态:

    • 起始状态 *
    • 运行状态 *
    • 暂停状态 *
    • 停止状态 *
      起始状态涉及:

创建一个新的Linux进程,为新的UI对象分配新的内存,并设置整个屏幕。

运行状态涉及:

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

暂停状态涉及:

当Activity不在前台而是在后台时,则称该Activity处于暂停状态。

停止状态涉及:

停止的活动只能通过重新启动它才能进入前台,也可以在任何时间点销毁它。
活动管理器处理所有这些状态的方式使得用户体验和性能始终处于最佳状态,即使在将新活动添加到现有活动的场景中也是如此

bhmjp9jg

bhmjp9jg4#

我喜欢这个问题及其答案,但是到目前为止,还没有介绍像*onPostCreate这样不常用的回调()*或*在“简历后”上()*. Steve Pomeroy试图绘制一个图表,其中包括这些内容以及它们与Android的Fragment生命周期的关系,我修改了Steve的大图,只包含Activity部分,并将其格式化为信纸大小的单页打印。我将其作为文本PDF发布在https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf,下面是其图像:

cs7cruho

cs7cruho5#

从Android开发人员页面,
打开暂停():
当系统即将开始恢复前一个活动时调用。这通常用于提交对持久性数据的未保存更改、停止动画和其他可能消耗CPU的操作等。此方法的实现必须非常快,因为在此方法返回之前不会恢复下一个活动。后跟onResume()(如果Activity返回到前端)或onStop()(如果Activity对用户不可见)。
停止时():
当活动对用户不再可见时调用,因为另一个活动已恢复并覆盖此活动。这可能是因为正在启动新活动、将现有活动置于此活动之前或正在销毁此活动。如果此活动返回以与用户交互,则后跟onRestart(),如果此活动即将离开,则后跟onDestroy()。
现在,假设有三个“活动”,您从A转到B,则现在将从B到C调用A的onPause,然后将调用B的onPause和A的onStop。
暂停的“活动”将恢复,停止的“活动”将重新启动。
当你调用this.finish()时,onPause-onStop-onDestroy会被调用,主要要记住的是:只要Android需要内存执行其他操作,暂停的Activity就会停止,并且已停止的Activity会被销毁。
希望你说得够清楚了。

cmssoen2

cmssoen26#

Android Activity的生命周期是什么?
在Android SDK框架中,每个Android Activity(Window)都有生命周期方法。这意味着,当用户进入应用程序时,他可以看到在onCreate()生命周期方法中创建的Activity。布局仅在onCreate()方法中附加在窗口中。
活动(窗口)具有以下生命周期状态:

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(已创建)-〉onStart(已启动)-〉onResume(恢复状态)将被调用。
Close the application from background:
当从后台关闭应用程序时,活动必须被销毁以释放一些内存。2因此,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()
7gs2gvoe

7gs2gvoe7#

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

请注意上表中的"Killable"列--对于那些标记为可终止的方法,在该方法返回后,系统可以随时终止托管活动的进程,而无需执行其另一行代码。
因此,应该使用onPause()方法写入任何持久性数据此外,在将Activity置于这样的后台状态之前,会调用方法onSaveInstanceState(Bundle),从而允许您将Activity中的任何动态示例状态保存到给定的Bundle中,以便在需要重新创建Activity时在onCreate(Bundle)中接收。
请注意,将持久性数据保存在onPause()而不是onSaveInstanceState(Bundle)中非常重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下都调用。
我想再添加几个方法。这些方法没有列为生命周期方法,但它们将在生命周期中根据某些条件被调用。根据您的要求,您可能必须在应用程序中实现这些方法以正确处理状态。

onPostCreate(Bundle savedInstanceState)

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

onPostResume()

当活动恢复完成时调用(在调用onResume()之后)。

onSaveInstanceState(Bundle outState)

调用以在Activity被终止之前从Activity检索每个示例的状态,以便可以在onCreate(Bundle)onRestoreInstanceState(Bundle)中还原该状态(由此方法填充的Bundle将传递给这两个Activity)。

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()没有被引用为生命周期方法,它也会被调用。

yjghlzjz

yjghlzjz8#

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

开始活动

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出现在每个离开的示例中(除了关闭应用程序)。

xkrw2x1b

xkrw2x1b9#

请参阅 * 活动生命周期 *(Android开发人员)。

    • 创建()时**:

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

    • 重新启动时()**:

在Activity停止后、重新启动前调用。始终后跟onStart()

    • 开始时()**:

当Activity对用户可见时调用。如果Activity进入前台,则后跟onResume()。

    • 在简历()上**:

当Activity将开始与用户交互时调用。此时,您的Activity位于Activity堆栈的顶部,用户输入将进入该Activity。始终后跟onPause()。

    • 在暂停()时:**

当Activity进入后台但尚未终止时,作为Activity生命周期的一部分调用。onResume()的对应函数。当Activity B在Activity A之前启动时,将在Activity A上调用此回调函数。在Activity A的onPause()返回之前,不会创建Activity B,因此请确保不要在此处执行任何冗长的操作。

    • 在停止()时**:

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

    • 在销毁()**时:

在Activity被销毁之前收到的最后一个调用。这可能是因为Activity正在完成(有人对它调用了finish()),也可能是因为系统暂时销毁了Activity的此示例以节省空间。您可以使用isFinishing()方法区分〉这两种情况。
"活动"首次加载时,事件调用如下:

onCreate()
onStart()
onResume()

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

onPause()
onStop()
    • 退出电话拨号程序**,将调用以下事件:
onRestart()
onStart()
onResume()

单击后退按钮或尝试**finish()**活动时,事件调用如下:

onPause()
onStop()
onDestroy()
    • 一个

Android操作系统使用优先级队列来帮助管理设备上运行的Activity。根据特定Android Activity所处的状态,将在操作系统中为其分配特定优先级。此优先级系统有助于Android识别不再使用的Activity,从而允许操作系统回收内存和资源。下图说明了Activity在其生存期内可以经历的状态:
这些状态可分为以下三大类:

    • 活动或正在运行**-如果Activity位于前台,则视为活动或正在运行,也称为Activity堆栈顶部。这被视为Android Activity堆栈中优先级最高的Activity,因此仅在极端情况下才会被操作系统终止。诸如如果Activity尝试使用比设备上可用的存储器更多的存储器,因为这可能导致UI变得无响应。
    • 已暂停**-当设备进入睡眠状态,或者Activity仍然可见但被新的非完整大小或透明Activity部分隐藏时,该Activity将被视为已暂停。暂停的Activity仍然处于活动状态,即它们保留所有状态和成员信息,并保持与窗口管理器的连接。这被视为Android Activity堆栈中第二高优先级的Activity,并且,因此,只有在终止此活动将满足保持活动/运行活动稳定和响应所需的资源要求时,才会被OS终止。
    • 已停止**-被另一个活动完全掩盖的活动被视为已停止或处于后台。已停止的活动仍会尝试尽可能长时间地保留其状态和成员信息,但已停止的活动被视为三种状态中优先级最低的,因此,操作系统将首先终止处于此状态的活动,以满足较高优先级活动的资源要求。
  • 了解生命周期的活动示例**
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");
    }
}

相关问题