1.设备配置与备选资源销魂重建Activity原理:
Android可自动完成调用最佳匹配资源的工作,但前提是它必须通过新建一个activity来实现显示一个新布局,方法setContentView(R.layout.)必须再次被调用。而调用setContentView(R.layout.方法又必须先调用Activity.
onCreate(…)方法。因此,设备一经旋转,Android需要销毁当前的Activity实例,然后再新建一个Activity来完成Activity.onCreate(…)方法的调用,这样方法setContentView(R.layout.)才会被调用,才会显示一个新布局,从而实现使用最佳资源匹配新的设备配置。2.设备旋转前保存数据
提取模型:参考文档如下- 2.1.方法onSaveInstanceState()默认的实现要求所有activity的视图将自身状态数据保存在Bundle对象中。Bundle是存储字符串键与限定类型值之间映射关系(键值对)的一种结构。操作系统将Bundle对象放入activity记录对象中。
- 2.2.覆盖onCreate(…)方法时,我们实际是在调用activity超类的onCreate(…)方法,并传入收到的bundle。在超类代码实现里,通过取出保存的视图状态数据,activity的视图层级结构得以重新创建。
- 2.3.总结:一个存,一个取,介质:Bundle,使用场景:单个组件内部。
- 2.4.Activity对象不再存在,但操作系统会将activity记录对象保存起来,在需要恢复activity时,操作系统可以使用暂存的activity记录对象重新激活activity,即使Android彻底停止当前应用的进程,暂存的activity记录依然被系统保留着,以便于用户返回应用时activity的快速恢复。
- 2.5.暂存的activity记录的生命周期(保存时间):场景一.用户按了后退键后,系统会彻底销毁当前的activit;场景二.系统重启或长时间不使用activity时.暂存的activity记录通常会被清除.
- 2.6.介质的局限性:数据类型只能是基本数据类型(primitive type)以及可以实现Serializable接口的对象。存储的类对象,必须实现Serializable接口。
- 2.7.测试:
法一:
http://developer.android.com/tools/debugging/debugging-devtools.html
法二:
启动Settings应用,点击Development options选项,找到并启用Don’ keep activities选项,现在运行应用,单击主屏幕键(如前所述,点击主屏幕键会暂停并停止当前activity)。随后就像Android 操作系统为回收内存一样,停止的activity被系统销毁了。
法三:
单击后退键后,无论是否启用Don’ keep activities选项,系统总是会销毁当前activity。单击后退键相当于通知系统“用户不再需要使用当前的activity”。
3.启动activity机制
- 3.1.流程:当activity调用startActivity(…)方法时,调用请求实际上是发送给操作系统的ActivityManager。ActivityManager负责创建Activity实例并调用其onCreate(…)方法。
- 3.2.Intent参数告知ActivityManager该启动哪一个Activity。
- 3.3.组件之间的通信介质:intent对象是component用来与操作系统通信的一种媒介工具,其不同的构造方法,满足不同的使用需求:
显式:传入该方法的Class对象指定ActivityManager应该启动的activity;Context对象告知ActivityManager在哪一个包里可以找到Class对象。【使用场景:是同一个包中】
隐式:一个应用的activity如需启动另一个应用的activity,借助于应用外部的ActivityManager,会使不同应用间的activity交互变得容易。
提取模型:参考文档如下
4.activity 间的数据传递【对话通信】
注解:单击后退键回到QuizActivity,CheatActivity随即会被销毁。在被销毁前的瞬间,它会将用户是否作弊的数据传递给QuizActivity.
4.1.介质:intent extra,extra信息可以是任意数据,它包含在Intent中,由启动方activity发送出去,接受方activity接收到操作系统转发的intent后,访问并获取包含在其中的extra数据信息.
4.2.发送过程:Intent.putExtra(…)方法有多种形式。不变的是,它总是有两个参数。一个参数是固定为String类型的key,另一个参数值可以是多种数据类型。
- 4.3.接收过程:Activity.getIntent() 方法返回了由startActivity(Intent) 方法转发的Intent对象。
4.4.Tip:包名来修饰extra数据信息,这样可以避免来自不同应用的extra间发生命名冲突。
5.从子activity获取返回结果
5.1.启动方:Activity.startActivityForResult(Intent, int requestCode):请求代码是先发送给子activity,然后再返回给父activity的用户定义整数值。当一个activity启动多个不同类型的子activity,且需要判断区分消息回馈方时。
5.2.设置返回结果和返回数据:Activity.setResult(int requestCode, Intent),实现子activity发送返回信息给父activity.
- 5.3.使用场景:当父activity需要依据子activity的完成结果采取不同操作时,这里的完成结果由requestCode决定,比如假设子activity有一个OK按钮及一个Cancel按钮,并且为每个按钮的单击动作分别设置了不同的结果代码。根据不同的结果代码,父activity会采取不同的操作。
Activity.RESULT_OK
Activity.RESULT_CANCELED - 5.4.说明:如果子activity是以调用startActivityForResult()方法启动的,结果代码则总是会返回给父activity。在没有调用setResult()方法的情况下,如果用户单击了后退按钮,父activity则会收到Activity.RESULT_CANCELED的结果代码。
- 5.5.设计原则:回传的数据信息需要在子类中定义常量extra key,传入及传出extra针对子类定义了统一的接口,这样,如果在应用的其他地方使用子类,我们只需要关注使用定义在子类中的那些常量。
- 5.6.处理返回结果:在用户单击后退键回到父类时,ActivityManager调用父activity的以下方法:protected void onActivityResult(int requestCode, int resultCode, Intent data)
该方法的参数来自于父Activity的原始请求代码以及子Activity传入SetResult(…)方法的结果代码和intent,某些参数条件判断编码会使用到请求代码或结果代码等这些代码值。
提起模型:参考文档如下:
- 6.回退栈
- 6.1.在桌面启动器中点击应用时,操作系统只是启动了应用中的launcher activity,在配置文件中,声明的intent-filter元素节点下,
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
- 6.2.
两种方式顶实例被弹出栈外:
1)单击后退键.
2)在栈顶Activity中调用Activity.finish()方法.
3)当栈顶中最后一个Activity界面单击后退键,将退回到桌面启动器界面launcher.
- 6.3.ActivityManager : ActivityManager维护着一个非特定应用独享的回退栈。所有应用的activity都共享该回退栈,。不局限于单个应用,回退栈作为一个整体共享给操作系统及设备使用,这也是将ActivityManager设计成操作系统级的activity管理器来负责启动应用activity的原因之一.