activity生命周期(Activity生命周期的特点)

http://www.itjxue.com  2023-01-26 10:59  来源:未知  点击次数: 

1 以下哪些是activity的生命周期

第一层循环是onPause - onResume - onPause,

第二层循环是onStop - onRestart - onStart - onResume - onPause - onStop。我们可以将这两层循环看成是整合Activity生命周期中的子生命周期。第一层循环称为焦点生命周期,第二层循环称为可视生命周期。也就是说,第一层循环在Activity焦点的获得与失去的过程中循环,在这一过程中,Activity始终是可见的。而第二层循环是在Activity可见与不可见的过程中循环,在这个过程中伴随着Activity的焦点的获得与失去。也就是说,Activity首先会被显示,然后会获得焦点,接着失去焦点,最后由于弹出其他的Activity,使当前的Activity变成不可见。因此,Activity有如下3种生命周期:

整体生命周期:onCreate - ... ... - onDestroy。

可视生命周期:onStop - ... ... - onPause。

焦点生命周期:onPause - onResume。

如何详解 Activity 的生命周期

如何详解 Activity 的生命周期

Android官方文档里对Activity的生命周期有比较详尽的描述,但由于资源回收机制带来不确定性,我们的程序运行结果常常与预期的不符,而调试这类问题又十分消耗时间和精力。解决的根本办法还是要理解透Activity的生命周期及相关内容,这篇帖子着重介绍Activity生命周期本身,之后会用一两篇帖子来介绍如何处理异常的状态变化。

下图是官方文档里的Activity生命周期图,其中彩色标出的四个框是Activity的四种状态,当Activity的状态改变时会触发一个或多个onXXX()方法。

onCreate()

当Acitivity第一次被创建时触发,一般在这里要做的事情包括创建视图(setContentView())、向视图填充必要的数据等等。

onRestart()

这个我比较少用到,按文档上的介绍,如果Activity之前被stop过,那么下一次onStart()方法之前会先触发这个方法。

onStart()

只要Activity从不可见变成可见,就会触发到这个方法,但被AlertDialog遮挡/显示的情况不算在内。

onResume()

当Activity来到最上层的时候,也就是开始与用户直接交互时,触发这个方法。例如本来Activity被一个AlertDialog遮挡,当这个AlertDialog消失时,onResume()方法就被触发。

onPause()

和onResume()的触发条件刚好相反,如果Activity本来在最上层,当它要让出最上层的位置时会触发这个方法。onPause()和onResume()是被触发最频繁的两个方法,所以在这里不应该执行过于消耗资源的方法。

onStop()

当有其他Activity覆盖了当前Activity时,不论另一个Activity是新开始的还是从下层移至最上层的,当前Activity的onStop()方法都会被触发。

onDestroy()

Activity生命周期的终点。有两种情况会导致它被触发:1)执行了Activity#finish()方法;2)Android系统由于资源不足等原因决定杀掉Activity所在进程。通过isFinishing()方法可以判断出是哪种情况。在这个方法里,我们一般要做的事情是释放Activity占有的资源,例如后台正在进行的下载线程等等。

最后,举个实际例子来说明,假设你有一个“首页Activity”和一个“编辑页Activity”。

当用户点击首页里的“开始编辑”按钮时,首页的onPause()-onStart()onStop()依次触发,编辑页的onCreate()-onStart()-onResume()依次触发;(感谢James.H.Fu指出的错误)

当用户在编辑页按下“返回”按钮时,编辑页的onPause()-onStop()依次触发,之后首页的onStart() - onResume()依次触发;

这时用户在首页按下“返回”按钮,首页的onPause()-onStop()-onDestroy()依次触发。

参考资料:

Activity Lifecycle

Simplest Android Activity Lifecycle

Activity lifecycle explained in details

activity 的可见生命周期有哪些

Android中Activity的生命周期可以分为四类:

foreground process(前景模式)

visible process(可见模式)

background process(背景模式)

empty process(空白模式)

参考官方给出的生命周期图可以知道Activity的生命周期分为7个方法

onCreate()、onStart() 、onResume()、 onPause()、onStop()、onDestory() 、onRestart()

其中前景模式是由onCreate(创建)、onStart(启动) 、onResume(可见可交互)三个方法来体现的。而可见模式则分为两种状态,一种是被Dialog覆盖,进入透明模式,在onPause(暂停)可以体现出来,第二就是如果当前Activity被完全覆盖,就会进入onStop状态,完全不可见,当覆盖物消失时会调用onRestart方法来唤醒该Activity,由覆盖状态重新变为可见状态,并重新执行onstart()和onResume()重新变为可见可交互状态。

如果Activity被完全覆盖的话,也就是所谓的第三种状态,背景模式。此时的Activity有两种处理方案可以使用,第一方案是调用onDestory()方法完全销毁当前的Activity。第二方案就是清除掉当前的Activity,并重新执行onstart()和onResume()重新变为可见可交互状态。

如果Activity被完全覆盖,并且系统需要内存时,就会暂时销毁Activity,进入空白模式,空白模式最重要的目的就是暂时释放出内存,直到使用者再度唤醒空白模式的 Activity时,才会将空白模式变成前景模式。

Android Activity生命周期解析

Activity 用户可以做单一的、集中的事情。几乎所有的Activity都与用户进行交互,所以Activity类负责创建一个窗口,你可以通过调用setContentView(View)把你的UI布局放置在Activity的窗口中。作为四大组件之一,使用频率非常高。深入了解Activity,对于我们高质量开发是很有帮助的,下面我们就来看看Activity的生命周期。

Android系统中是通过Activity栈的方式来管理Activity的,而Activity自身则是通过生命周期的方法来管理的自己的创建与销毁。那么我们就来看看Activity生命周期是怎样运作的。

周期即活动从开始到结束所经历的各种状态。生命周期即活动从开始到结束所经历的各个状态。从一个状态到另一个状态的转变,从无到有再到无,这样一个过程中所经历的状态就叫做生命周期。

Acitivity本质上有四种状态:

在上面的四中常有的状态之间,还有着其他的生命周期来作为不同状态之间的过度,用于在不同的状态之间进行转换。

我们先来看看下面这张经典的生命周期流程图:

1)启动Activity

onCreate() — onStart() — onResume()

2)按Home键回到桌面 / 锁屏

onPause() — onStop()

3)从桌面回到Activity / 解锁

onRestart() — onStart() — onResume()

4)跳转新Activity

A: onPause() — onStop()

B: onCreate() — onStart() — onResume()

A — B: onPause()_A — onCreate()_B — onStart()_B — onResume()_B — onStop()_A

5)返回上一个Activity

B: onPause() — onStop() — onDestroy()

A: onRestart() — onStart() — onResume()

B — A: onPause()_B — onRestart()_A — onStart()_A — onResume()_A — onStop()_B — onDestroy()_B

6)退出Activity

onPause() — onStop() — onDestroy()

Activity官方文档,开启传送门

至此Activity的整个生命周期都介绍完了,现在我们再看之前的生命周期流程图,是不是清晰许多。搞清楚Activity活动原理,这样理解起来就会容易许多,工作中也能如鱼得水。

Activity的生命周期及常见回调顺序

关于Activity的生命周期相信不少人都觉得自己很了解了,毕竟大多数入门的时候都会首先学这个,但事实真的是这样吗?当初我也是这样想,直到在面试的时候栽了跟头~ 在哪跌倒就在哪爬起来,本文带你全面的了解一下Activity的生命周期,面试再问到也不怕啦

首先按照官方生命周期流程图逐个解释生命周期回调

当Activity首次创建的时候触发,这是生命周期的第一个方法,我们需要重写这个回调,并在调用setContentView()去加载界面布局资源,以及实例化一些变量。该方法有一个参数savedInstanceState,该参数包含Activity先前保存状态的Bundle对象。如果Activity是由于异常情况(切换横竖屏,内存不足等)被杀掉的,则Bundle对象的值不为null,否则Bundle的值为null。所以如果想要在onCreate()中做恢复工作需要对Bundle判断是否为空。不过建议在onRestoreInstanceState()方法中做恢复工作,因为该方法一旦被调用则Bundle不会为空。

表示Activity正在重新启动。一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart就会被调用。这种情形一般是用户行为导致的,比如用户按Home键切换到桌面或打开了另一个新的Activity,接着用户又回到了这个Actvity。

表示Activity正在被启动,即将开始,这时Activity已经出现了,但是还没有出现在前台,无法与用户交互。这个时候可以理解为Activity已经显示出来,但是我们还看不到。

相信很多人会有疑问,什么叫Activity已经显示出来了,但是看不到???因为我们能看到的都是View或者和View有关联的东西,而Activity确实是没有什么直观的东西让我们看到的。所以这里说的看不到其实是看不到View,因为此时View还不是可见的,只有在onResume的时候才会把View设置为可见,想了解清楚的可以查看 Window和WindowManager的创建与Activity

此时Activity进入前台,具备与用户交互的能力。与onStart()都是对用户可见,但是onStart()时Activity是位于后台的,onResume()时Activity才显示到前台。 如果我们在onPause()中释放了组件,我们应该在onResume()中重新初始化。 我们应该在这里开始动画和初始化一些只有用户关注时才使用的组件。

当用户离开了Activity时会回调这个方法,比如说:

我们可以在这个方法中执行一些释放资源的操作,比如broadcast receivers,sensors,以及一些用户在不交互时不需要的资源。

该方法执行的时间非常简短,因此不应该在这个方法保存程序或用户数据;在该方法完成之前,保存工作可能并未完成。而且会影响到新的Activity的显示,因为onPause()执行完,新Activity才会开始执行onCreate()。

当Activity对用户不再可见的时候会回调该方法,比如说启动一个新的Activity把屏幕全都遮住了。

之前说过不建议在onPause()做一些重量级的释放工作,应该交由onStop()去释放大多数资源。比如unregisterReceiver(),还有其他可能导致内存泄露的资源,因为系统可能在没有回调onDestroy()的时候就杀掉了进程。

在Activity被销毁之前会回调该方法,这也是Activity生命周期的最后一个回调。

如果在Activity调用了finish()或者由于内存紧张系统销毁了该Activity,也有可能是由于横竖屏的切换或者用户按了返回键都会导致该方法的回调,

我们应该在这个方法中回收之前没有回收掉的所有资源

ActivityA:onPause() -ActivityB:onCreate()-ActivityB:onStart()-ActivityB:onResume()- ActivityA:onStop()

当ActivityA调用完onPause()之后才会调用ActivityB的onCreate(),所以不要在onPause()中做耗时操作,会影响新Activity的显示。

只有当ActivityB的onResume()调用完之后才会调用ActivityA的onStop(),因为此时ActivityB在最上面,ActivityA才是完全不可见的。

onPause()-onSaveInstanceState()-onStop()-onDestroy()-onCreate()-onStart()-onRestoreInstanceState()-onResume()

如果没有在AndroidManifest设置configChanges,则屏幕旋转的时候会吧Activity销毁再重建,并且重建后的Activity和原来的不是同一个实例。

如果设置了android:configChanges="orientation|screenSize",则屏幕旋转时只会调用onConfigurationChanged()方法,并且不会销毁重建

首先每个应用最少有一个进程,我们的Activity都是运行在进程中的,当应用退到后台时,系统可能因为内存不足而杀掉优先级低的进程,那么再该进程中的Activity都会被杀死,这种情况是不会走Activity的生命周期的,只有杀掉单个Activity的时候才会走Activity的onDestroy()方法。

onPause()-onStop()-onDestroy()

当Activity弹出Dialog获取PopupWindow是不会走任何生命周期的。

弹出DialogActivity原来的Activity会执行onPause(),关闭DialogActivity原来的Activity执行onResume()

onPause()-onStop()-onRestart()-onStart()-onResume()

onPause()-onNewIntent()-onResume()

Activity与Fragment的生命周期详解

一.Activity的生命周期

首先我们来看一下官方文档中给出的图示:

通过上述图示,我们可以总结Activity的生命周期规律如下:

1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

注意onPause与onStop的不同,onPause表示该Activity处于可见状态但无法获取用户焦点,如在当前Activity上弹出一个对话框,则用户焦点被对话框获取,但当前Activity仍然可以看到,而onStop表示该Activity处于不可见状态,如从一个Activity跳转到另一个Activity,则之前的Activity处于不可见状态。

二Fragment的生命周期

还是先上官方文档图:

从上述图示可以看到Fragment与Activity的生命周期极其相似,我们先看一下只存在于Fragment中的几个方法:

onAttach方法:顾名思义,是Fragment和Activity建立关联的时候调用。

onCreateView方法:为Fragment加载布局时调用。

onActivityCreated方法:当Activity中的onCreate方法执行完后调用。

onDestroyView方法:Fragment中的布局被移除时调用。

onDetach方法:顾名思义,是Fragment和Activity解除关联的时候调用。

重点注意一下onActivityCreated(),因为该方法是在Activity中的onCreate方法执行完成后调用,所以在onActivityCreated()调用之前 Activity的onCreate可能还没执行,所以不能在onCreateView()中进行 与Activity相关的UI操作,而应该在onActivityCreated()中进行与Activity相关的UI操作,而onCreateView中只进行UI的显示操作。

另外需要注意Fragment中不存在onRestart()方法,该方法只存在与Activity中。

(责任编辑:IT教学网)

更多

相关Dreamweaver教程文章

推荐Dreamweaver教程文章