Activity是Android组件中最基本也是最为常见用的四大组件(Activity活动,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。 前端
Activity是“单任务焦点”的,也就是说用户只能与一个active(running)的Activity交互。一个Activity一般就是一个单独的屏幕/界面,负责管理界面上的各类控件(widgets),能够在Activity的onCreate(Bundle savedInstanceState)方法中调用setContentView(int layoutResID) 向其添加视图/控件, layoutResID为在xml中定义的layout,能够经过自动生成的R类访问:R.layout.xxx。 android
Activity类的继承关系及实现的主要接口以下图所示,继承自Activity的主要子类有FragmentActivity, ListActivity, NativeActivity, ActivityGroup 等。 安全
Activity做为与用户的交互界面,须要保持快速响应,通常5秒左右就会提示异常,所以在Activity中不作耗时的操做,以下载上传数据。耗时操做可使用Service或者使用多线程。 多线程
Activity的使用首先须要深刻理解其生命周期 ide
Activity在应用程序的整个生命周期中扮演者重要的角色,系统采用一个“活动堆栈”来管理全部的Activity,一个新Activity启动后会被放在堆栈顶部,并保持running状态,前一个running的activity将被下压并暂停,直到用户back,新Activity退出后回到栈顶并running,这正是栈的先进后出原则。 动画
Activity定义了大量的回调方法来完成整个生命周期,这些方法都是会自动调用的,能够在Activity的子类中重载,添加所须要的逻辑代码: spa
方法 .net |
简介 线程 |
Killable? xml |
next方法 |
onCreate(Bundle) |
Activity建立后被调用的第一个方法,通常用来完成全部的静态设置,如中建立views,ListView绑定数据,如调用:setContentView(int layoutResID) findViewById(int id)(ps:若是是fragment中的控件,该方法返回null,fragment是在该方法以后执行的) 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会被调用; |
|
|
用户设置(如屏幕方向)改变触发的回调方法。 Manifest.xml中配置android:configChanges,指定在哪些状况下执行该方法,如” locale|fontScale|orientation ”,经过这样设置则Activity不从新建立,为指定的配置改变,则会致使Activity从新建立。 在实际开发中横竖屏切换等保留Activity不被从新建立是很是重要的。 |
|
|
|
onActivityResult(int,int, ntent) |
使用startActivityForResult方法启动另一个Activity,在返回的时候触发该事件。 参数: requestCode:请求码,用来标记是由哪一个请求返回的结果,与startActivityForResult中的一致。 resultCode:结果码,与setResult中的参数一致,经常使用的:RESULT_CANCELED ,RESULT_OK,RESULT_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()从新启动
Ø 调用另一个Activity:onPause()——onStop()将当前Activity 中止stoped,而后调用新的Activity的onCreate(Bundle)——onStart()——onResume()将新Activity激活。
Ø 按下返回back键:onPause()——onStop()——onDestroy ()将当前的Activity销毁,而后调用onRestart()——onStart()——onResume()从新回到前一个Activity。
在Activity的生命周期中,一般有四种状态(running,paused,stopped,destroyed):
Ø 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()方法)或者被移除killed,Activity则被Destroyed掉,系统能够将其从内存中清除。Destroyed的 Activity代表其已经被销毁,若是须要再使用者须要从新create。
一个Activity生命周期中,这些回调方法执行有三种的状况:
Ø 全lifetime:从onCreate(Bundle)到onDestroy()。onCreate配置资源,onDestroy销毁资源,如在onCreate中建立后台线程,在onDestroy中中止。
Ø 可见lifetime: 从onStart() 到onStop()。Activity在屏幕上可见,有可能不在前台,不能与用户交互。onStart和onStop能够被屡次执行。
Ø 前台liftime:从onResume()到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以外执行后台操做的时候须要在BroadcastReceiver,Service。
参考阅读:http://my.oschina.net/keeponmoving/blog/60943