Activity基础
继承关系
简介
Activity专注于与用户交互,可以通过 setContentView(View) 来设置UI界面,通常情况下都是全屏显示的,当然也有其他形式如:
- 浮动窗口(R.attr.windowIsFloating)
- Multi-Window模式
- 内嵌其他窗口。
Acitivty是应用程序整个生命周期的重要组成部分,Activity的启动和组合方式是平台应用程序模型的基本部分.
生命周期
Activity被ActivityStacks管理.当启动一个新的Activity,它会出现在ActivityStacks的栈顶,旧的Activity将会入栈并等待新的Activity退出。
Acitivity状态
Activity拥有四个状态:
- Active:
此时处于ActivityStacks栈顶位置。 - Visible:
Activity失去焦点但仍处于可见状态(比如被一个Float模式的Acitivity遮挡但部分可见),那么此时是Visible状态. - Stop:
被其他Acitivity完全遮挡,那么此时是stop状态。它将保存所有状态信且不再显示。当系统其他地方需要内存时可能会将其kill而进行到4状态。 - Destroy:
系统可以通过finish请求或者直接杀进程的方式来关闭Activity来使其达到destroy状态,再次启动时需要restart然后恢复状态。生命周期
其中有三个主要的循环点来理解Activity声明周期:
- 生命周期的过程都是以 onCreate 开始, 以 onDestroy 结束。所以Aciticty的初始化工作应放在onCreate中, 结束工作应放在onDestroy中。此周期适合创建和销毁用于后台数据处理的Thread.
- 生命周期中的可见范围是以 onStart开始, 以onStop 结束。适合创建和销毁监听系统消息而更新Activity的BroadcastReceiver.onStart和onStop在Activity的显示和隐藏过程中会持续被调用。
- 生命周期中活跃状态范围以onResume开始,onPause结束。
生命周期方法介绍:
1 | public class Activity extends ApplicationContext { |
- onCreate: activity第一次创建时被调用,随后调用的是onStart
- onRestart: activity在被stop然后重新回到前台时调用,随后调用onStart
- onStart: Activity可见时调用,后接onResume或者onStop.
- onResume: 当Activity开始与用户交互时被调用,此时表示Activity已在Stack顶,随后跟onPause.
- onPause: 当Activity失去前台状态之前被调用, 包括失去焦点、停止、隐藏、销毁等状态. 此方法不能执行太多耗时操作。后接onResume或onStop.
- onStop: 当Activity不再显示时调用,后接onRestart或onDestroy.
- onDestroy: 当Activity被销毁时调用。
其中onStop和onDestroy返回之后,系统可能随时将Activity销毁并不去执行本应执行的代码,所以需要将一些必要的信息通过onPause 来存储在磁盘中。此外onSaveInstanceState(Bundle) 函数也具有保存信息以便下次恢复Activity的同时恢复数据的功能,但仅仅是当re-create状态并回调onCreate时才会有效,所以推荐保存状态使用onPause.
配置更改
通常情况下当系统配置更改(如 横竖屏、语言、输入设备等状态切换)时,Acitivty会经过onPause->onStop->onDestroy等过程进行销毁,然后通过onCreate重建.
如果不想在配置更改时重新经过生命周期,则可以通过在Manifest中添加Activity属性android:configChanges,并赋值选择需要过滤的类型,如
1 | android:configChanges="keyboardHidden|orientation|screenSize" |
此时当发生满足条件的配置改变时,则直接回调 onConfigurationChanged(Configuration)方法。
进程生命周期
Android系统会尽可能的去保留一个程序进程的进行,但是当内存不足时则需要按照重要性杀掉旧的进程.一般来说,基于其中运行着Activity的进程来说, 一共有四种不同的状态,按照重要性从上到下为:
- 具有前台Active状态的Activity
- 具有一个visible状态的Activity
- 一个Stop状态的Activity
- 不包含Activity(例如Service、BroadcastReceiver)的进程
(完)
本文档总结自android developers