一、Activity的基本概念
概念:代表一个可以进行任务交互的窗口界面。可包含多层级的View和ViewGroup。
创建:继承一个Activity或着它已存在的子类。必须实现onCreate()方法,调用setContentView()来加载用户交互的布局。并在AndroidManifest.xml的<application>中配置一个<activity>的节点,指明android:name属性。
启动一个Activity:
(1)启动主Activity。清单文件配置“MAIN”action和“LAUNCHER”category。
(2)启动普通Activity使用intent。一般调用startActivity(),包含两种方式,显示和隐示意图。显示是指intent指明要启动的Activity名称,隐示是不指定具体的Activity,只描述一下intent的Action,或加上data等,让系统过滤intent-filter来挑选最合适的Activity。
(3)需要从启动的Activity中获取一个结果。用startActivityForResult()来启动Activity,需指明intent和requestCode,然后实现onActivityResult()回调接口来获取返回后的结果。onActivityResult()中需判断resultCode是否是成功返回,通过requestCode来判断是否响应的是指定的请求。
二、Activity的生命周期管理
为什么要管理生命周期,Activity是应用程序的主体,是用户体验的第一道窗口(所见),当然至关重要。这里的原则通常来说有以下几点需要遵循:
- 当使用你的app的时候,不会因为屏幕切换而导致程序crash(来电、闹铃、其它程序、旋转屏幕);
- 当用户没有使用或不需要某些组件的时候不要浪费宝贵的系统资源;
- 不会因为离开当前app一段时间而导致某些至关重要的用户使用进度丢失。
- ... ... ...
怎么管理,通过实现Activity生命各阶段的回调方法来管理。下面是一幅activity的回调方法和对于生命状态图:
其中只有三种状态是静态的,Activity可以再这三种状态上保持很长时间,其它状态会很快地切换掉,停留时间短。
- Resumed:也称为runing状态,Activity在最前端,可捕获焦点,与之交互。
- Paused:Activity被另外一个activity半遮盖(另外一个activity是半透明或只遮住屏幕一部分,总之Paused状态的Activity对用户是可见但不可操作的)
- Stoped:Activity被完全隐藏,不被用户可见,
各个回调方法的常用操作:
onCreate():设置layout,定义成员变量,配置UI元素等,(尽量少做事情,不然等待activity显示的时间太长)
onRestart():上次Stopped后但未被重新启动该Activity。
onStart():继续维持你在activity里需要显示的资源,也可根据情况管理它们,或者注册广播等(时间也别长)
onResume():你在onPause()里需要释放什么,就要在这儿恢复什么
onPause():停止动画或其它导致CPU浪费的操作,释放一下资源,比如sencor、Camera等。为避免进入下一个activity时间太长,这个回调函数尽量别做CPU耗时的操作,具体原因参见下面activityA-->B的回调执行流程。
onStop():这儿可以把需要的数据存储到持久化存储(File、DB 等)
onDestroy():释放掉不需要的当前Activity用到的一切资源,比如子线程,cursor等。
另外两个类似生命周期的方法:
onSaveInstanceState() :一旦Activity进入非前台进程,即离开resumed状态(runing状态),都是有可能在极端情况下因系统内存不足导致该程序进程被杀死,所以如果我们需要保存该Activity UI上需要的一些信息,以便下次创建该Activity时重新使用这些信息(在Bundle里),我们便可以在onSaveInstanceState()里put需要的值进bundle。
onRestoreInstanceState():如果启动的Activity上次是被意外强制关闭,且需要恢复上次的使用进度值,用此回调实现。
从ActivityA启动ActivityB回调函数执行流程:(以下讨论activity的launchMode为standard)
从ActivityB 按返回键返回 ActivityA:
旋转屏幕ActivityA:
如果不想要重新create activity,可以在AndroidManifest.xml里配置<activity>里加上如下配置。
android:configChanges="orientation|screenSize|keyboardHidden"
三、Activity的四种启动模式及应用场景
启动模式的设置:
<activity android:name=".MainActivity" android:launchMode="standard" />
也可以在startActivity()的时候可用给Intent加相应的标志位FLAG_ACTIVITY_***。
四种启动模式:
- standard
标准启动模式,每次激活一个Activity时都会创建一个该Activity的实例(哪怕是自己),并放入任务栈中。
- singleTop
如果任务栈栈顶正好存在该Activity的实例,就重用该实例。(仅限于栈顶,重用时会调onNewIntent())
- singleTask
整个任务栈只能有一个该Activity的实例,如果在栈中已经存在该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
- singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中
应用场景:
默认值是standard,具体情况具体分析,但要确保Activity的可用性测试,包括启动过程,和其它Activity交互过程,返回键Home键等等,
四、其它
1、关于<activity>在AndroidManifest.xml中的配置属性的中文介绍
参考这位博主的博客:http://www.cnblogs.com/popapa/p/android_activity-element.html
2、Activity弹出Toast或者Dialog不会引起生命周期的变化。