Activity和Activity类
Activity是一个用户可以做的单一的、专注的事情。几乎所有的Activity都是和用户交互,因此Activity类负责创建一个可以使用setContentView(View)方法放置UI的窗口。活动常常以全屏窗口的方式展示给用户,同时也以浮动窗口、嵌入到其他活动中的子窗口等形式。在几乎所有Activiy类的子类中,需要实现以下两个方法:
- onCreate(Bundle)方法是Activity初始化的地方。这个方法最重要的一点是,它要调用setContentView(int)方法,传入定义UI的layout资源ID。同时使用findViewById(int)方法来获取需要编程处理的UI中的组件。
- onPause()方法是处理用户离开Activiy的地方。这个方法最重要的一点保存用户做的任何改变。
为了使用Context.startActivity(),所有活动都必须在包的AndroidManifest.xml文件中有一个相应的<activity>
声明。
Activity的生命周期
Android系统中的Activity以Activity栈的方式管理。当一个新的Activity开始时,它置于栈顶成为正在运行的活动,上一个活动处于栈中该活动的下面,直到新的Activity退出才再次回到前台。
一个Activity主要包括以下四个状态:
- 激活/运行状态。当一个Activity处于前台(在Activity栈中位于栈顶)时,该Activity处于激活或运行状态。
- 暂停状态。当一个Activity失去焦点但仍然可见(例如,一个新的非全屏的Activity处于当前Activity之上),该Activity处于暂停状态。一个暂停状态的Activity是依然在运作的(它维护状态和成员信息,仍然附加在窗口管理器中),但是当系统处于内存极低的情况下暂停的Activity可以被终止。
- 停止状态。当一个Activity完全被另一个Activity遮挡时,该Activity处于停止状态。它仍然保留所有状态和成员的信息,然而它不再对用户可见,它的窗口被隐藏。当需要内存的时候它可以被系统终止。
- 当一个活动处于暂停或停止状态时,系统以请求的方式或直接终止其进程的方式将该活动清出内存。如果它要再次显示给用户,它需要完全重新开始并还原它之前的状态。
下图显示了一个Activity的重要的状态切换路径。长方形框代表回调函数。通过实现这些回调函数可以在状态切换时执行需要的操作。着色的椭圆形代表Activity的主要状态。
在一个Activity中有三个需要注意的关键循环:
- 全生命周期。一个Activity的整个生命周期是从调用onCreate(Bundle)开始,到调用onDestroy()结束的。每个Activity都会在onCreate()方法中设置全局状态,并且在onDestroy()方法中释放所有剩下资源。例如,如果需要一个后台线程从网站下载数据,那么这个线程应该在onCreate()方法中创建,在onDestroy()方法中停止。
- 可见的生命周期。一个Activity对用户可见是从调用onStart()开始直到调用onStop()结束。在这个时间里,用户可以在屏幕上看见这个Activity,尽管它不在前台不能与用户交互。在这两个方法之间,可以维护那些需要显示给用户的资源,例如可以在onStart()方法调用时注册一个BroadcastReceiver来监控可能影响UI的变化,并且在onStop()方法中取消注册。随着Activity在可见与不可见间的变化,onStart()和onStop()方法可以被调用多次。
- 前台生命周期。一个Activity的前台生命周期开始于onResume()方法,而结束于onPause()方法。在这时,该Activity处于所有其它的Activity之前并且与用户交互。一个Activity可能频繁地执行onResume()和onPause()方法(例如,当设备休眠时或传送Activity结果时或传送Intent时),因此这两个方法中的代码要是相当轻量的。
整个Activity的生命周期由下面的方法定义,这些方法都是可以重载的回调函数,支持在Activity改变状态时执行相应的工作。所有的Activity都要实现onCreate(Bundle)方法来执行它们的初始化,很多Activity也执行onPause方法来提交改变的数据或准备终止和用户交互。在实现这些方法时,应该首先调用父类的实现。
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
方法 | 描述 | 是否可终止 | 后续方法 |
---|---|---|---|
onCreate() | Activity第一次创建时调用。这个方法中应该执行所有静态的设置:创建视图,将数据绑定到列表等。这个方法提供一个Bundle对象包含该Activity之前冻结的状态。执行完后总要执行onStart() | 否 | onStart() |
onRestart() | 当处于停止状态的Activity被重新激活时,后面紧随onStart() | 否 | onStart() |
onStart() | 当Activity开始对用户可见时调用。若Activity进入前台则调用onResume(),如果Activity被隐藏则调用onStop() | 否 | onResume()或onStop() |
onResume() | 当Activity开始和用户交互时调用。此刻,Activity处于Activity栈的顶端,接受用户输入。 | 否 | onPause() |
onPause() | 当系统准备恢复之前的Activity或启动一个新Activity时调用。在这个方法里提交未保存的数据、停止动画或其他可能消耗CPU等的事情。实现的方法必须比较快,因为下一个Activity只有在这个方法返回后才会恢复。如果Activity回到前台,则执行onResume(),若变成对用户不可见,则执行onPause() | onResume或onStop | |
onStop | 当Activity不再为用户可见时调用,因为可能某一个Activity正已被恢复正在覆盖该Activity。这可能发生在开启了一个新活动,或者一个已存在的Activity被调到前台或者当前的Activity正被销毁等。当Activity重新回来与用户交互,则调用onRestart(),若这个Activity正被清除,则调用onDestroy() | 是 | onRestart()或onDestroy() |
onDestroy() | 当Activity被销毁时最后接收的调用。调用可以发生在Activity执行完毕,或者系统正在临时销毁活动的实例以节省空间。可以使用isFinishing()方法区分这两种情况 | 是 | 无 |
可终止的方法是指在方法执行后的任何时刻该Activity所在的进程都可能被系统所终止。而不可终止的方法是指从该方法执行开始、该方法执行之后在没有遇到可终止的方法之前Activity的进程无法被系统终止。