安卓活动生命周期 - 这些方法都是干什么用的?

452

什么是 Android 活动的生命周期?为什么在初始化期间会调用许多听起来相似的方法(onCreate()onStart()onResume()),而在结束时会调用许多其他方法(onPause()onStop()onDestroy())?

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


20
为什么这个问题被投票点赞这么多次?为什么它没有被关闭? - Alexander Kulyakhtin
60
为什么会关闭得票数很高的问题?Stackoverflow有这样的坏习惯。 - Dick Lucas
14
这是一个维基风格的问题,我认为它应该被允许在网站上。 - Mateen Ulhaq
4
@Alexander Kulyakhtin - 为什么要关闭这个问题?相反,如果您无法理解提供给新安卓用户的答案中的信息,您应该关闭自己的帐户。这个问题充满了知识,我将投赞成票支持这个问题。 - Stack Overflow
关于这些方法何时被调用的问题,你尝试过什么? - Sreekanth Karumanaghat
评论:为什么这个问题被赞了这么多次? 我:继续点赞 - Alex Pogiba
9个回答

783

Activity 生命周期(Android 开发者官网)中查看。

图片描述

onCreate()

当 Activity 第一次创建时调用。这里是进行所有正常的静态设置的地方:创建视图,将数据绑定到列表等。如果存在先前冻结的状态,则此方法还提供了一个包含该状态的 Bundle。始终紧随 onStart()。

onRestart()

在 Activity 停止后再次启动之前调用。始终紧随 onStart()。

onStart()

当 Activity 对用户可见时调用。如果 Activity 进入前台,则紧随其后的是 onResume()。

onResume()

当 Activity 开始与用户交互时调用。此时,您的 Activity 位于活动堆栈的顶部,并且用户输入将发送到该 Activity。始终紧随 onPause()。

onPause():

作为 Activity 生命周期的一部分,当一个 Activity 进入后台但尚未被销毁时调用,它是 onResume() 的对应方法。当 Activity B 在 Activity A 前面启动时,将在 A 上调用此回调。B 将不会创建,直到 A 的 onPause() 返回,因此请确保此处不要做任何长时间的操作。

onStop()

当您对用户不再可见时调用。接下来,根据稍后的用户活动,您将收到 onRestart()、onDestroy() 或什么都不收到的通知。请注意,在低内存情况下,如果系统没有足够的内存使 Activity 的进程在其 onPause() 方法被调用后继续运行,则可能永远不会调用此方法。

onDestroy():

在 Activity 销毁之前的最后一个调用。这可能是因为 Activity 即将结束(有人在其上调用了 finish() 方法),或者是因为系统暂时销毁该 Activity 实例以节省空间。您可以使用 isFinishing() 方法区分这两种情况。

当 Activity 第一次加载时,以下事件会被调用:

onCreate()
onStart()
onResume()

当您点击电话按钮时,活动将进入后台,并调用以下事件:

onPause()
onStop()

退出电话拨号器,以下事件将被调用:

onRestart()
onStart()
onResume()

当你点击返回按钮或尝试调用finish()方法来结束活动时,事件会按照以下方式被调用:

onPause()
onStop()
onDestroy()

活动状态

Android操作系统使用优先级队列来协助管理设备上运行的活动。基于特定Android活动所处的状态,它将在操作系统内被分配一定的优先级。这种优先级系统有助于Android识别不再使用的活动,从而允许操作系统回收内存和资源。以下图表说明了活动在其生命周期中可以经历的状态:

这些状态可以分为三组,如下所示:

激活或运行 - 如果活动位于前台,也就是活动堆栈的顶部,则认为活动是激活或正在运行的。这被认为是Android活动堆栈中最高优先级的活动,因此只有在极端情况下,例如如果活动尝试使用多于设备可用内存的内存,可能会导致用户界面无响应等情况时,操作系统才会强制结束该活动。

暂停 - 当设备进入睡眠状态,或者一个活动仍然可见但被新的非全屏或透明活动部分遮挡时,该活动被认为是暂停的。暂停的活动仍然存活,也就是说,它们保持所有状态和成员信息,并继续附加到窗口管理器。这被认为是Android活动堆栈中第二高优先级的活动,因此,只有在结束此活动将满足维持激活/运行活动稳定和响应所需的资源要求时,操作系统才会强制结束该活动。

停止 - 完全被其他活动遮挡的活动被认为是已停止或处于后台。已停止的活动仍然尝试保留其状态和成员信息,但已停止的活动被认为是三种状态中优先级最低的,因此,操作系统首先会结束该状态下的活动以满足更高优先级活动的资源需求。

*样本活动以了解生命周期*

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
所以如果我理解正确,onStop()总是在onPause()之后调用的? - Titouan de Bailleul
4
当你不再对用户可见时,会调用“onStop()”方法。但并非总是如此。 - Yaqub Ahmad
2
有没有什么可能在onCreate之前被调用的东西? - NodeDad
7
是的,有默认构造函数(即没有参数的那个)。但是它只适用于极其基本的初始化目的,通常情况下,除非您确实知道自己在做什么,否则不应使用它。即使如此,如果有更好的方法来完成任务,您也应该三思而后行。 - Mjoellnir
1
我认为这个链接可能会帮助你更好地理解活动的生命周期。 https://iphtechnologies.com/understanding-lifecycle-in-android-activity/ - Ashish Kumar Mishra
显示剩余3条评论

183

Activity 有六个状态

  • Created(已创建)
  • Started(已启动)
  • Resumed(已恢复)
  • Paused(已暂停)
  • Stopped(已停止)
  • Destroyed(已销毁)

Activity 生命周期 有七种方法

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

activity life cycle

图示来源

情况

  • 打开应用程序时

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

7
屏幕上打开任何对话框时,都会调用onPause()方法,但这并不适用于AlertDialog。只有当对话框本身是一个对话框活动(其主题设置为@android:style/Theme.Dialog)时,才会调用该方法。 - gaurav jain
2
有价值的回答。请提交给 Google 添加到他们的文档中。我正在将您的答案保存到 Word 文档中以便保留! - likejudo
1
我不理解“任何电话响铃并且用户在应用程序中”的意思。具体是什么情况?我的第一反应是,如果用户在应用程序中,手机开始响铃,那么如果全屏变成呼叫,则会执行onPause()--> onStop()。对于悬浮式来电消息,可能只是OnResume-->onPause(),但我不确定。在通话中,onPause()--> onResume()的情况是什么?是在通话结束时吗? - Sotti
这正是我在寻找的。只是想知道我应该把我的 API 调用放在哪里。 - Heisenberg
我喜欢你基于场景的回答。 - Ayub
“当屏幕上打开任何对话框时,都会调用onPause()”这句话不是应该在对话框显示之前就调用了吗?其他答案中说,在onPause()返回之前不会创建新的活动,因此我不确定在onPause()返回或(更糟糕的是)被调用之前如何在当前活动的顶部显示任何内容。 - Mehdi Charife

162
整个混乱的起因是谷歌选择了非直观的名称,而不是像以下这样的内容:
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] 

活动图可以解释为:

enter image description here


1
这要看情况。除非它能解决混淆,否则长名称并不会有害。例如:onRoutePresentationDisplayChanged() 是 Android SDK 内部的一个函数。 - Nilesh Pawar
14
个人认为你们的命名方式并没有更加直观易懂,而且与“Fragments”也没有什么关联。 - Martin Marconcini
9
点赞。比官方文档更有帮助。 - bad_keypoints
3
很棒的文章,但有一个问题。当你在谷歌搜索“Android生命周期方法”时,会出现这张图片,在搜索选项上方(甚至不是在图片搜索模式下),作为答案呈现给你。不知情的人(或懒惰的人,这取决于你怎么看)可能会被误导,除非他们查看StackOverflow链接而不是点击流程图像(即你的图片)。 - Andrew S
1
是的,这正是我一直在寻找的。有人应该写一本书(或文档?)来介绍这样的内容。onResume等等根本没有意义。 - anotherDev
显示剩余7条评论

23

安卓生命周期

安卓应用程序的生命周期由七种方法管理:

  • onCreate():当活动被创建时调用。
  • onStart():当活动正在变为对用户可见时调用。
  • onResume():当活动开始与用户交互时调用。
  • onRestart():当活动重新启动时调用,此时它已停止但尚未销毁。
  • onPause():当活动即将停止并失去焦点时调用。
  • onStop():当活动不再可见时调用。
  • onDestroy():当活动被销毁时调用。

这些方法都是干什么用的:

让我们来看一个简单的场景,了解这些方法的调用顺序将帮助我们清楚地知道它们为什么被使用。

  • 假设您正在使用一个计算器应用程序。三个方法依次被调用以启动应用程序。

onCreate() - - - > onStart() - - - > onResume()

  • 当我在使用计算器应用程序时,突然来了一个电话。计算器活动转到后台,另一个活动处理通话并进入前台,现在两个方法依次被调用。

onPause() - - - > onStop()

  • 现在假设我结束了电话交谈,计算器活动从后台回到前台,所以三个方法依次被调用。

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

  • 最后,假设我已经完成了计算器应用中的所有任务,并且想要退出应用程序。接着会依次调用两个方法。

onStop() - - - > onDestroy()


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

  • 启动状态
  • 运行状态
  • 暂停状态
  • 停止状态

启动状态包括:

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

运行状态包括:

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

暂停状态包括:

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

停止状态包括:

只能通过重新启动来将停止的活动带入前台,并且可以在任何时候销毁它。

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


有没有关于 onPauseonResume 的示例? - zeeali

16
我喜欢这个问题和答案,但目前还没有涵盖 less frequently used callbacks,例如 onPostCreate() 或 onPostResume()。Steve Pomeroy 试图绘制了一个图表,包括这些回调函数以及它们与 Android 的 Fragment 生命周期的关系,请参见 https://github.com/xxv/android-lifecycle。我修改了 Steve 的大图表,只包括 Activity 部分,并将其格式化为信纸大小的一页打印。我已经将其作为文本 PDF 发布在 https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf,下面是其图像:

Android Activity Lifecycle


9

来自Android开发者页面,

onPause():

当系统即将开始恢复先前的活动时调用。 这通常用于提交未保存的更改到持久数据、停止动画和其他可能占用CPU等资源的操作。 此方法的实现必须非常快,因为下一个活动只有在此方法返回后才会恢复。 然后是onResume(),如果活动返回到前台,则后面是onStop(),如果它变得对用户不可见。

onStop():

当活动对用户不再可见时调用,因为另一个活动已经被恢复并覆盖了这个活动。 这可能是因为正在启动新的活动,正在将现有的活动带到这个活动的前面,或者正在销毁这个活动。 如果此活动要与用户交互,则后面跟着onRestart(),否则后面跟着onDestroy()。

现在假设有三个活动,您从A转到B,那么A的onPause将被调用,现在从B到C,然后B的onPause和A的onStop将被调用。

暂停的活动将获得恢复,而停止的活动将重新启动。

当您调用this.finish()时,将调用onPause-onStop-onDestroy。需要记住的主要事项是:暂停的活动会被停止,而停止的活动会在Android需要内存进行其他操作时被销毁。

希望这足够清晰。


我们可以将onPause方法称为活动开始失去焦点和最终对用户变得完全不可见之间的中间阶段,而将Onstop方法称为当活动已完全对用户不可见时的方法。 - Nav
我认为应该是这样的。 - Masiar
3
假设有三个活动,你从A前往B,那么A的onPause将被调用,现在从B前往C,那么B的onPause和A的onStop将被调用。 - MKJParekh

5
Android活动的生命周期是什么? 在Android SDK框架中,每个Android Activity(窗口)都有生命周期方法。这意味着当用户进入应用程序时,他可以看到已在onCreate()生命周期方法中创建的Activity。布局仅在onCreate()方法中附加到窗口中。 Activity(窗口)具有以下生命周期状态:
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(恢复状态)。
从后台关闭应用程序:
当从后台关闭应用程序时,必须销毁活动以释放一些内存。因此,将调用 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()

如果用户未接听电话:

无 - 不会调用任何生命周期。

关机按钮:

当用户关闭电源按钮时:

onPause()

onStop()

当解锁设备时:

onRestart()

onStart()

onResume()

弹出对话框:

当弹出对话框出现时,不会调用任何生命周期函数。

重新启动设备或关闭:

当用户重新启动或关闭设备时:

onPause()

onStop()

当用户从主屏幕点击应用图标时:
onCreate()

onStart()

onResume()

3

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

来源:developer.android.com

enter image description here

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

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

请注意,将持久数据保存在onPause()中比在onSaveInstanceState(Bundle)中进行重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下都被调用。

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

onPostCreate(Bundle savedInstanceState)

onStart()onRestoreInstanceState(Bundle)方法调用完成后,活动启动完成时调用该方法。
onPostResume()

onResume()方法被调用后,当活动恢复完成时调用。
onSaveInstanceState(Bundle outState)

在被销毁之前,调用此方法从活动中检索每个实例的状态,以便在onCreate(Bundle)onRestoreInstanceState(Bundle)中恢复状态(由此方法填充的Bundle将传递给两者)。请保留HTML标记。
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()仍会被调用。

2
我跟随以上的回答运行了一些日志,并得到了以下输出:

开始活动

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接