Activity的说明
Activity是一个
应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。每个Activity都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上。
一个应用通常由多个彼此松散联系的Activity组成
。一般会指定应用中的某个Activity为"主"Activity,即首次启动应用时呈现给用户的那个Activity。而且每个Activity均可启动另一个Activity,以便执行不同的操作。每次新的Activity启动时,前一个Activity便会停止,但系统会在堆栈("
返回栈
")中保留该Activity。当新Activity启动时,系统会将其推送到返回栈上,并取得用户焦点。返回栈遵循"
后进先出
"堆栈机制,因此,当用户完成当前Activity并按"返回"按钮时,系统会从堆栈中将其弹出(并销毁),然后恢复前一Activity。
当一个Activity因某个新Activity启动而停止时,系统会通过该Activity的生命周期回调方法通知其这一状态变化
。Activity因状态变化-系统是创建Activity、停止Activity、恢复Activity还是销毁Activity-而收到的回调方法可能有若干种,每一种回调方法都会为您提供执行与该状态变化相应的特定操作的机会。例如,停止时,您的Activity应释放任何大型对象,例如网络或数据库连接。当Activity恢复时,您可以重新获取所需资源,并恢复执行中断的操作。这些状态转变都是Activity生命周期的一部分。
Activity的基本使用
创建Activity
要创建Activity,您必须创建Activity的子类(或使用其现有子类)。您需要在子类中实现Activity在其生命周期的各种状态之间转变时(例如创建Activity、停止Activity、恢复Activity或销毁Activity)系统调用的回调方法。两个最重要的回调方法是:
onCreate()
您必须实现此方法。系统会在创建您的Activity时调用此方法。您应该在实现内初始化Activity的必需组件。最重要的是,您必须在此方法内调用setContentView(),以定义Activity用户界面的布局。
onPause()
系统将此方法作为用户离开Activity的第一个信号(但并不总是意味着Activity会被销毁)进行调用。您通常应该在此方法内确认在当前用户会话结束后仍然有效的任何更改(因为用户可能不会返回)。
您还应使用几种其他生命周期回调方法,以便提供流畅的 Activity 间用户体验,以及处理导致您的 Activity 停止甚至被销毁的意外中断。 后文的管理Activity生命周期
部分对所有生命周期回调方法进行了阐述。
启动、关闭Activity
正如前面介绍的,一个Android应用通常都会包含多个Activity,但只有一个Activity会作为程序的入口----当该Android应用运行时将会自动启动并执行该Activity。至于应用中的其他Activity,通常都由入口Activity启动,或由入口Activity启动的Activity启动。
Activity启动其他Activity有如下两个方法。
- startActivity(Intent intent):启动其他Activity。
- startActivityForResult(Intent intent, int requestCode):以指定的请求码(requestCode)启动Activity,而且程序将会等到新启动Activity的结果(通过重写onActivityResult(...)方法来获取)。
上面两个方法都用到了Intent参数,Intent是Android应用里各个组件之间通信的重要方式,一个Activity通过Intent来表达自己“意图”----想要启动哪个组件,被启动的组件即可是Activity组件,也可是Service组件。
Android为关闭Activity准备了如下两个方法:
- finish():结束当前Activity。
- finishActivity(int requestCode):结束以startActivityForResult(Intent intent, int requestCode)方法启动的Activity。
Intent intent = new Intent(StartActivity.this, SecondActivity.class);
startActivity(intent);
// 结束当前Activity
finish();
使用Bundle在Activity之间交换数据
当一个Activity启动另一个Activity时,常常会有一些数据需要传过去。在Activity之间进行数据交换主要是通过Intent,把需要交换的数据放入Intent即可。
Intent提供了多个重载的方法来“携带”额外的数据,如下所示:
- putExtras(Bundle data):向Intent中放入需要“携带”的数据包。
- Bundle getExtras():取出Intent所“携带”的数据包。
- putExtra(String name, Xxx value):向Intent中按key-value对的形式存入数据。
- getXxxExtra(String name):从Intent中按key取出指定类型的数据。
下面的示例程序示范了两个Activity之间如何通过Bundle交换数据。
FirstActivity发送数据:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
Bundle data = new Bundle();
data.putSerializable("person",p);
intent.putExtras(data);
startActiv