文章目录
Activity主要负责与用户交互,并向用户呈现应用状态。
4.1.1 高级Activity
4.1.2 配置Activity
Android应用要求所有应用程序组件(Activity、Service、ContentProvider、BroadcastReceiver)都必须显示进行配置。
只要在AndroidManifest.xml中为<application>元素添加<activity>子元素即可配置Activity。
常用属性:
- name:指定该Activity的实现类的名称
- icon:指定该Activity对应的图标
- label:指定该Activity的标签
- exported:指定该Activity是否允许被其他应用调用。
- launchMode:指定该Activity的加载模式,该属性支持standard、singleTop、singleTask和singleInstance这四种加载模式。
此外,在配置Activity时通常还需要指定一个或多个<intent-filter>元素,该元素用于指定该Activity可响应的Intent。
如果如下配置Activity,那么该Activity将成为应用的主活动,也就是应用程序的入口。
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
4.1.3 启动、关闭Activity
启动Activity
Activity启动其他Activity有两个方法:
- startActivity(Intent intent):启动其他Activity。
- startActivityForResult(Intent intent,int requestCode):以指定的请求码(requestCode)启动Activity,而且程序会获取新启动Activity返回的结果(通过重写onActivityResult()方法来获取)。
Intent:“意图”——用来表达想要启动哪一个组件(Activity或Service)。
requestCode:请求码的值由开发者根据业务自行设置,用于标识请求来源。
关闭Activity
两个方法:
- finish():结束当前Activity。
- finishActivity(int requestCode):结束以请求码requestCode启动的Activity。
使用Bundle在Activity之间交换数据
因为两个活动通过Intent产生联系,所以将需要交换的数据放入Intent即可。
Intent的相关方法:
- putExtras(Bundle data):向Intent中放入需要携带的数据包。
- Bundle getExtras():取出Intent中所携带的数据包。
- putExtra(String name,Xxx value):向Intent中按key-value对的形式存入数据。
- getXxxExtra(String name):从Intent中按key取出指定类型的数据。
Bundle是一个简单的数据携带包,Bundle中包含的方法:
- putXxx(String key,Xxx value):向Bundle中放入Int、Long、Serializable等各种类型的数据。
- getXxx(String key):从Bundle中取出Int、Long、Serializable等各种类型的数据。
注意:
- 既然Intent携带Bundle来传递数据,且Bundle已经包含了putXxx(String key,Xxx value)和getXxx(String key)两个传入数据和获取数据的方法,那么为什么Intent也包含putExtra(String name,Xxx value)和getXxxExtra(String name)两个传入数据和获取数据的方法呢?这是因为Intent提供的putExtra(String name,Xxx value)和getXxxExtra(String name)时便捷的方法,这些方法依然是存取Intent所携带的Bundle中的数据。
- Intent的putExtra(String name,Xxx value)方法是智能的。调用该方法时,如果Intent已结携带了Bundle对象,那么该方法直接向该Bundle对象存入数据;如果Intent没携带Bundle对象,那么该方法会先为Intent创建一个Bundle对象,再向Bundle中存入数据。
启动其他Activity并返回结果
应用场景:应用程序第一个界面需要用户进行选择,但需要选择的列表数据比较复杂,必须启动另一个Activity让用户选择。当用户在第二个Activity选择完成之后,程序返回第一个Activity,第一个Activity必须能获取并显示用户在第二个Activity中选择的结果。这种应用场景下,也是通过Bundle进行数据交换的。
获取被启动Activity所返回的结果,需要两个步骤:
- 当前Activity需要重写
onActivityResult(int requestCode, int resultCode, Intent intent)
,当被启动的Activity返回结果时,该方法将会被触发,其中requestCode代表请求码,而resultCode代表结果码,这个结果码也是由开发者根据业务自行设定的。当一个Activity包含多个onActivityResult(int requestCode, int resultCode, Intent intent)方法来打开多个不同的Activity处理不同的业务——为了知道该方法是由那个请求的结果所触发的,可利用requestCode请求码;为了知道返回的数据来自哪个被启动的Activity,可以用resultCode结果码。 - 被启动的Activity需要调用
setResult()
方法设置处理结果。