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

Nav*_*Nav 406 lifecycle android onresume oncreate ondestroy

Android活动的生命周期是什么?为什么这么多的发音相似的方法(onCreate(),onStart(),onResume()初始化过程调用),和许多其他人(onPause(),onStop(),onDestroy())呼吁在结束了吗?

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

Yaq*_*mad 737

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

在此输入图像描述

onCreate():

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

onRestart():

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

onStart():

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

onResume():

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

onPause():

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

onStop():

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

onDestroy():

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

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

onCreate()
onStart()
onResume()
Run Code Online (Sandbox Code Playgroud)

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

onPause()
onStop()
Run Code Online (Sandbox Code Playgroud)

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

onRestart()
onStart()
onResume()
Run Code Online (Sandbox Code Playgroud)

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

onPause()
onStop()
onDestroy()
Run Code Online (Sandbox Code Playgroud)

活动国家

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的 - 默认构造函数(没有参数的构造函数).但它仅用于非常基本的初始化目的.通常你应该_not_使用它,除非你真的知道你在做什么.即便如此,如果有更好的做事方式,你应该三思而后行. (5认同)
  • 并非总是"onStop():当用户不再可见时调用" (4认同)
  • 在onCreate之前有什么机会被调用吗? (2认同)

Nil*_*war 153

由于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] 
Run Code Online (Sandbox Code Playgroud)

活动图可以解释为:

在此输入图像描述

  • 我个人并不觉得你的名字更直观,加上碎片,它并没有真正的相关性. (11认同)
  • Upvoted.比官方文档更有帮助 (9认同)
  • 这是一个很棒的帖子.一个问题.当你输入Andoid生命周期方法来谷歌这个图像出现在搜索选项(甚至在图像搜索模式下)作为Android生命周期方法的答案.除非他们遵循StackOverflow链接而不是单击流程图图像(您的图像),否则不知道(或懒惰取决于您如何看待它)可能很容易被误导. (3认同)

Aru*_*mar 152

活动有六个州

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

活动生命周期有七种方法

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

活动生命周期

情况

  • '当屏幕上打开任何对话框时,调用onPause()',对于alertdialog不适用.只有当对话框本身是一个对话框活动(主题设置为@android:style/Theme.Dialog)时才会调用它. (5认同)
  • 有价值的答案.请将此提交给谷歌以添加到他们的文档中.我保存你的Word文档的答案保持! (2认同)

Dev*_*ath 21

ANDROID LIFE-CYCLE

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


回答所有这些方法:

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

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

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

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

onPause() - - - > onStop()

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

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

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

onStop() - - - > onDestroy()


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

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

起始状态涉及:

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

运行状态包括:

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

暂停状态包括:

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

停止状态涉及:

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

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


COD*_*EaD 13

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

Android活动生命周期


Mas*_*iar 7

从Android Developers页面,

在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需要内存用于其他操作,暂停活动就会停止并且停止活动会被销毁.

我希望它足够清楚.

  • @Nav假设有3个活动,你从A到B,然后onPause现在将被调用从B到C然后onPause of B和onStop of A将被调用. (3认同)

Luf*_*ffy 5

Android Activity 的生命周期是怎样的?

在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.
Run Code Online (Sandbox Code Playgroud)

为什么在初始化期间调用了这么多听起来相似的方法(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()
Run Code Online (Sandbox Code Playgroud)

当您从 android studio 运行应用程序时:

onCreate()

onStart() 

onResume()
Run Code Online (Sandbox Code Playgroud)

活动转换:

当从第一个活动 -> 第二个活动移动时:

first_activity  : onPause()

second_activity : onCreate()

second_activity : onStart()

second_activity : onResume()

first_activity  : onStop()
Run Code Online (Sandbox Code Playgroud)

从第二个活动 -> 第一个活动移动时:

second_activity : onPause()

first_activity  : onRestart()

first_activity  : onStart()

first_activity  : onResume()

second_activity : onStop()

second_activity : onDestroy()
Run Code Online (Sandbox Code Playgroud)

概览按钮:

当用户单击“概览”按钮(硬件第三个按钮 - 最近列表)时:

onPause()

onStop()
Run Code Online (Sandbox Code Playgroud)

用户关闭概览按钮后(或)用户从最近的列表中转到一些其他应用程序并返回到应用程序:

onRestart()

onStart()

onResume()
Run Code Online (Sandbox Code Playgroud)

主页按钮:

当用户单击主页按钮时:

onPause()

onStop()
Run Code Online (Sandbox Code Playgroud)

用户搜索主屏幕并单击应用程序图标返回活动:

onRestart()

onStart()

onResume()
Run Code Online (Sandbox Code Playgroud)

用户接到电话:

当用户在活动中时,电话打来:

onPause()

onStop()
Run Code Online (Sandbox Code Playgroud)

如果用户没有参加通话,它会自动断开连接并返回活动状态(未接来电):

onRestart()

onStart()

onResume()
Run Code Online (Sandbox Code Playgroud)

如果用户未参加通话:

N/A - 不会调用任何生命周期。

关机按钮:

当用户关闭按钮电源时:

onPause()

onStop()
Run Code Online (Sandbox Code Playgroud)

解锁设备时:

onRestart()

onStart()

onResume()
Run Code Online (Sandbox Code Playgroud)

弹出对话框:

当弹出对话框出现时 - 不会调用任何生命周期

重新启动设备或关闭:

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

onPause()

onStop()
Run Code Online (Sandbox Code Playgroud)

当用户单击主屏幕上的应用程序图标时:

onCreate()

onStart()

onResume()
Run Code Online (Sandbox Code Playgroud)