文档章节

Activity生命周期、回调方法及状态详解

h
 huist
发布于 2015/12/21 15:00
字数 2090
阅读 2169
收藏 3

 

Activity概述

ActivityAndroid组件中最基本也是最为常见用的四大组件(Activity活动,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。

Activity是“单任务焦点”的,也就是说用户只能与一个activerunning)的Activity交互。一个Activity通常就是一个单独的屏幕/界面,负责管理界面上的各种控件(widgets),可以在ActivityonCreate(Bundle savedInstanceState)方法中调用setContentView(int layoutResID) 向其添加视图/控件, layoutResID为在xml中定义的layout,可以通过自动生成的R类访问:R.layout.xxx。

Activity类的继承关系及实现的主要接口如下图所示,继承自Activity的主要子类有FragmentActivity,  ListActivity,  NativeActivity, ActivityGroup 等。

Activity作为与用户的交互界面,需要保持快速响应,一般5秒左右就会提示异常,因此在Activity中不做耗时的操作,如下载上传数据。耗时操作可以使用Service或者使用多线程。

Activity生命周期

Activity的使用首先需要深入理解其生命周期

Activity在应用程序的整个生命周期中扮演者重要的角色,系统采用一个“活动堆栈”来管理所有的Activity,一个新Activity启动后会被放在堆栈顶部,并保持running状态,前一个runningactivity将被下压并暂停,直到用户back,新Activity退出后回到栈顶并running,这正是栈的先进后出原则。

Activity回调方法

Activity定义了大量的回调方法来完成整个生命周期,这些方法都是会自动调用的,可以在Activity的子类中重载,添加所需要的逻辑代码:

方法

简介

Killable?

next方法

onCreate(Bundle)

Activity创建后被调用的第一个方法,一般用来完成所有的静态设置,如中创建viewsListView绑定数据,如调用:setContentView(int layoutResID)

findViewById(int id)ps:如果是fragment中的控件,该方法返回nullfragment是在该方法之后执行的)

Bundle参数可以用来恢复之前保持的状态数据,横竖屏切换的时候则会用到。

该方法调用之后一般会自动调用onStart()方法

No

onStart()

onRestart()

Stopped状态的Activity重新被调用的时候调用该方法。如用户由其他Activity返回的时候。

No

onStart()

onStart()

activity被调到前台可见之前执行该方法。在创建onCreate后或者重新启动onRestart后调用。该方法执行后,一般情况下,系统会自动调用onResume()方法,异常情况,也有可能直接调用onStop()方法。

No

onResume()

onStop()

onResume()

调用该方法后,Activity处于前台可见、可交互状态,Activity处于running状态

No

onPause()

onPause()

Activity在被其他activity遮盖之前执行该方法;Activity处于Paused状态,在3.1之前的版本中在极端情况下回被系统killed

在这个方法中可以用来保存持久化数据、停止动画和其他消耗cpu的事情等,只能执行轻量级的快速操作。

执行耗时的操作在onStop比较合适一些

 

onResume()

onStop()

onStop()

Activity完全不可见的时候执行该方法,比如:新的Activity启动并覆盖了当前的activity,或者返回到前一个Activity。当前Activity处于Stopped,随时可能被系统销毁,也有可能被重新启动调到前台。

异常情况,该方法可能不会执行,Activity直接被killed

Yes

onRestart()

onDestroy()

onDestroy()

Activity资源被系统回收之前执行的最后一个方法,调用finish()或者系统临时销毁Activity的时候调用,可以使用isFinishing()进行判断是正常销毁还是异常情况。

用户改变设置(屏幕方向、语言、输入设备等)当前Activity实例会被销毁,然后重新创建一个新的实例;

异常情况,该方法可能不会执行,Activity直接被killed

Yes

 

 

其它重要方法

 

 

onSaveInstanceState(Bundle)

可以使用方法onSaveInstanceState(Bundle)保存状态信息,如UI的变化信息,然后调用方法onCreate(Bundle)恢复;

Activity生命周期内,一些情况下该方法可能不会执行,用onPause()方法代替。

用户按下home键、长按home键、按下电源键、启动另外一个activity、切换屏幕方向等onSaveInstanceState会被调用;

 

 

onConfigurationChanged(Configuration) 

用户设置(如屏幕方向)改变触发的回调方法。

Manifest.xml中配置android:configChanges,指定在哪些情况下执行该方法,如 locale|fontScale|orientation ,通过这样设置则Activity不重新创建,为指定的配置改变,则会导致Activity重新创建。

在实际开发中横竖屏切换等保留Activity不被重新创建是非常重要的。

 

 

onActivityResult(int,int, ntent)

使用startActivityForResult方法启动另外一个Activity,在返回的时候触发该事件。

参数:

requestCode:请求码,用来标记是由哪个请求返回的结果,与startActivityForResult中的一致。

resultCode:结果码,与setResult中的参数一致,常用的:RESULT_CANCELED RESULT_OKRESULT_FIRST_USER等。

Data:附件的数据Intent对象,

 

 

 

这些回调方法的调用顺序:

Ø  第一次启动:onCreate(Bundle)——onStart()——onResume(),完成调用后Activity在最前端与用户是可以交互的。

Ø  启动后按下home键:onPause()——onStop()Activity停止stoped,再次运行的时候调用顺序:onRestart()——onStart()——onResume()

Ø  启动之后按下back键:onPause()——onStop()——onDestroy ()Activity销毁,调用:onCreate(Bundle)——onStart()——onResume()重新启动

Ø  调用另外一个ActivityonPause()——onStop()将当前Activity 停止stoped,然后调用新的ActivityonCreate(Bundle)——onStart()——onResume()将新Activity激活。

Ø  按下返回back键:onPause()——onStop()——onDestroy ()将当前的Activity销毁,然后调用onRestart()——onStart()——onResume()重新回到前一个Activity

 

Activity几种状态

Activity的生命周期中,通常有四种状态(runningpausedstoppeddestroyed):

Ø  Running在屏幕最前面,界面是可见的、可交互的,运行在堆栈的顶部,执行完onResume()方法之后直到onPause()就是这个状态。

Ø  Paused被其他activity部分覆盖的时候,界面可见但失去焦点,不可交互, activity是存活的(保留了所有状态信息),当系统内存很低的时候可能会被直接killed掉。执行完onPause()后直到onStop()就是这个状态。Paused状态的Activity调用onResume方法后可以重新回到活动状态。

Ø  Stopped被其他Activity完全覆盖的时候,仍保留了状态信息,界面完全不可见,Stopped状态的Activity通常都会因为需要内存而被系统killed。执行完onStop()方法后直到onDestroy()就是这个状态。Stopped状态的Activity调用onRestart方法可以重新回到活动状态。

Ø  Destroyed处于Paused Stopped状态的Activity,当系统要求(调用finish()方法)或者被移除killedActivity则被Destroyed掉,系统可以将其从内存中清除。DestroyedActivity表明其已经被销毁,如果需要再使用者需要重新create

一个Activity生命周期中,这些回调方法执行有三种的情况:

Ø  lifetimeonCreate(Bundle)onDestroy()onCreate配置资源,onDestroy销毁资源,如在onCreate中创建后台线程,在onDestroy中停止。

Ø  可见lifetime onStart() onStop()Activity在屏幕上可见,有可能不在前台,不能与用户交互。onStartonStop可以被多次执行。

Ø  前台liftimeonResume()onPause()Activity处于前台,能够与用户交互, resumed paused状态可以多次切换,这两个方法中放在轻量级代码。

Android是多任务系统,系统会对Activity进行一个优先级排序:

Ø  foreground activity位于屏幕最上层与用户交互的Activity,其进程一般不会被killed,系统异常情况下,也是最后被killed的。

Ø  visible activity可见不可交互的,优先级仅次于foreground activity

Ø  background activity不可见,其进程可能会被系统安全的killed以回收内存,重新回到该Activity的时候,其onCreate(Bundle)onSaveInstanceState(Bundle)会被调用恢复状态信息。

Ø  empty process没有Activity或者组件在运行。系统会自动结束进程回收资源,因此,在activity之外执行后台操作的时候需要在BroadcastReceiverService


参考阅读:http://my.oschina.net/keeponmoving/blog/60943


© 著作权归作者所有

h
粉丝 2
博文 4
码字总数 11242
作品 0
杭州
私信 提问
加载中

评论(1)

葫爷爷
葫爷爷
Android Activity的生命周期详解

Activity是由Activity栈进管理,当来到一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activity底部。Acitivity一般意义上有四种状态: 1.当Activity位于栈顶时...

恰同学少年
2015/07/27
0
0
Android零基础入门第86节:探究Fragment生命周期

一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用。Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的Activity的生命周期...

鑫鱻
2017/10/30
0
0
Android Fragment---与Activity生命周期的协调

拥有Fragment的Activity的生命周期直接影响了其中的Fragment的生命周期,这样,针对Activity的每一个生命周期的回调都会有一个类似的针对Fragment的回调。例如,当Activity收到onPause()回调...

长平狐
2012/10/16
1K
0
android Fragments详解六:处理fragement的生命周期

把条目添加到动作栏 你的fragment们可以向activity的菜单(按Manu键时出现的东西)添加项,同时也可向动作栏(界面中顶部的那个区域)添加条目,这都需通过实现方法onCreateOptionManu()来完...

jxlgzwh
2013/07/19
0
0
Android开发学习笔记(五):Starting an Activity

Starting an Activity 不像其他的编程模式中,应用程序是由main()方法发起的,Android系统启动代码在一个activity实例通过调用的回调方法,对应于特定阶段的生命周期。有一系列回调方法用于启...

AllenYao
2013/01/07
0
1

没有更多内容

加载失败,请刷新页面

加载更多

数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
4
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
5
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0
聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部