码迷,mamicode.com
首页 > 其他好文 > 详细

[01] 四大组件之Activity

时间:2015-02-28 13:00:45      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

一、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是应用程序的主体,是用户体验的第一道窗口(所见),当然至关重要。这里的原则通常来说有以下几点需要遵循:
  1. 当使用你的app的时候,不会因为屏幕切换而导致程序crash(来电、闹铃、其它程序、旋转屏幕);
  2. 当用户没有使用或不需要某些组件的时候不要浪费宝贵的系统资源;
  3. 不会因为离开当前app一段时间而导致某些至关重要的用户使用进度丢失。
  4. ... ... ...
怎么管理,通过实现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中的配置属性的中文介绍
 
2、Activity弹出Toast或者Dialog不会引起生命周期的变化。

 

[01] 四大组件之Activity

标签:

原文地址:http://www.cnblogs.com/ddd2014/p/4305124.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!